数据处理基础—数据类型了解一下
书籍翻译
好的书籍是人类进步的阶梯,但有些人却找不到优秀的阶梯,为此我们开设了书籍翻译这个栏目,作为你学习之路的指路明灯;分享国内外优秀书籍,弘扬分享精神,做一个知识的传播者。
希望大家能有所收获!
正
文
R/Bioconductor简介
5.3
数据类型/类
R是一种高级语言,因此底层数据类型通常并不重要。例外是如果您使用其他语言(如C)直接访问R数据,但这超出了本课程的范围。相反,我们将考虑基本数据类型:数字,整数,逻辑和字符,以及称为“因子”的更高级数据类。您可以使用“class()”函数检查数据的类。
除此之外:R还可以将数据存储复杂数字为'complex’,但通常这与生物分析无关。
5.3.1
数字
“数字”类是存储任何数字数据的默认类 - 整数,十进制数,科学计数法中的数字等...
x = 1.141
class(x)## [1] "numeric"y = 42
class(y)## [1] "numeric"z = 6.02e23
class(z)## [1] "numeric"
在这里我们看到,即使R有一个“整数”类,42也可以更有效地存储为整数,但是R默认是将其存储为“数字”类。如果我们想要42存储为整数,我们必须“强制”它到该类:
y = as.integer(42)
class(y)## [1] "integer"
强制将强制R将数据存储为特定类,如果我们的数据与该类不兼容,它仍将执行此操作,但数据将转换为NA:
as.numeric("H")## Warning: NAs introduced by coercion## [1] NA
上面我们试图将由双引号标识的“字符”数据强制转换为无意义的数字数据,因此我们触发(“threw”)警告消息。由于这只是一个警告,R将继续执行脚本或者函数中的任何后续命令,而“错误”将导致R停止。
5.3.2
字符/字符串
“character”类存储各种文本数据。编写程序时习惯将包含多个字母的数据称为“字符串”,因此大多数作用于字符数据的R函数将数据称为“字符串”,并且通常在其名称中包含“str”或“string”。字符串通过双引号标识,而变量或者函数的名称则没有:
x = 5
a = "x" # character "x"
a## [1] "x"b = x # variable x
b## [1] 5
除了标准的字母数字字符外,字符串还可以存储各种特殊字符。使用后面跟着的单个字符来识别特殊字符,最相关的是tab的特殊字符:\t
和换行符:\n
。为了演示这些特殊字符,可以将两个字符串连接起来(cat),这些字符分隔(sep)它们:
cat("Hello", "World", sep= " ")## Hello Worldcat("Hello", "World", sep= "\t")## Hello Worldcat("Hello", "World", sep= "\n")## Hello
## World
请注意,特殊字符在不同的函数中有不同的作用,例如,该paste
函数执行和cat
相同的操作,但不识别特殊字符。
paste("Hello", "World", sep= " ")## [1] "Hello World"paste("Hello", "World", sep= "\t")## [1] "Hello\tWorld"
paste("Hello", "World", sep= "\n")
## [1] "Hello\nWorld"
单反斜杠或双反斜杠也可用作escape
,功能是关闭特殊字符的功能或允许引号包含在字符串中:
cat("This \"string\" contains quotation marks.")
## This "string" contains quotation marks.
特殊字符通常仅用于模式匹配,以及将数据读取或者写入文件。例如,这是您用标签分隔的文件读入R的方式。
dat = read.delim("file.tsv", sep="\t")
另一种特殊类型的字符数据是颜色。颜色可以通过三种主要方式指定:使用可用的名称,使用rgb
函数获得红色,绿色,蓝色值,或者通过使用hsv函数改变色调(颜色),饱和度(颜色与白色)和值(颜色/白色与黑色)。
默认情况下,rgb和hsv会在0-1中有三个值,透明度是可选的第四个值。或者,可以从许多不同的包中加载具有有用属性的预定颜色组,其中RColorBrewer是最受欢迎的颜色之一。
reds = c("red", rgb(1,0,0), hsv(0, 1, 1))
reds
## [1] "red" "#FF0000" "#FF0000"
barplot(c(1,1,1), col=reds, names=c("by_name", "by_rgb", "by_hsv"))
5.3.3
逻辑
在logical
类存储布尔真值,即TRUE和FALSE。它用于存储逻辑运算的结果,条件语句将被强制转换为此类。大多数其他数据类型也可以强制转换为布尔值而不会触发(或“throw”)错误消息,这可能会导致意外的事情发生。
x = TRUE
class(x)
## [1] "logical"
y = "T"
as.logical(y)
## [1] TRUE
z = 5
as.logical(z)
## [1] TRUE
x = FALSE
class(x)
## [1] "logical"
y = "F"
as.logical(y)
## [1] FALSE
z = 0
as.logical(z)
## [1] FALSE
练习1使用其他字符和数值进行实验,这些值被强制转化为为TRUE或FALSE?你有没有收到警告/错误信息?
5.3.4
因子
字符串/字符数据存储效率非常低,每个字母通常需要与整数相同的内存量。因此,当存储具有重复元素的字符串向量时,更有效地办法是将每个元素分配给整数并将向量存储为整数和附加的字符串与整数关联的表格中。因此,默认情况下,R将读取数据表的文本列作为因子。
str_vector = c("Apple", "Apple", "Banana", "Banana", "Banana", "Carrot", "Carrot", "Apple", "Banana")
factored_vector = factor(str_vector)
factored_vector
## [1] Apple Apple Banana Banana Banana Carrot Carrot Apple Banana
## Levels: Apple Banana Carrotas.numeric(factored_vector)
## [1] 1 1 2 2 2 3 3 1 2
因子的双重性质可能导致一些不直观的行为。例如,将两个因子结合在一起会将它们转换为数字形式,原始的字符串将丢失。
c(factored_vector, factored_vector)
## [1] 1 1 2 2 2 3 3 1 2 1 1 2 2 2 3 3 1 2
同样,如果由于格式问题,数字数据被错误地解释为字符串,那么在强制转换为数值之前必须将因子转换回字符串:
x = c("20", "25", "23", "38", "20", "40", "25", "30")
x = factor(x)
as.numeric(x)
## [1] 1 3 2 5 1 6 3 4
as.numeric(as.character(x))
## [1] 20 25 23 38 20 40 25 30
要使R读取文本作为字符数据而不是因子,需要设置环境选项stringsAsFactors=FALSE
。这必须在每个R会话刚开始时完成。
options(stringsAsFactors=FALSE)
练习如何使用因子为上面的任意长的矢量,比如str_vector
,创建颜色矢量?
5.3.5
检查类/类型
我们建议您在读取文件后检查数据类型是否正确:
x = 1.4
is.numeric(x)
## [1] TRUE
is.character(x)
## [1] FALSE
is.logical(x)
## [1] FALSE
is.factor(x)
## [1] FALSE
5.4
基本数据结构
到目前为止,我们只关注单个值和向量。向量是R中最简单的数据结构。它们是所有相同类型的一维数据数组。如果创建向量时的输入具有不同类型,则它将被强制转换为与数据最一致的数据类型。
x = c("Hello", 5, TRUE)
x## [1] "Hello" "5" "TRUE"
class(x)
## [1] "character"
在这里,我们尝试将字符,数字和逻辑数据放入单个向量中,以便将所有值强制转换为character数据。
matrix
是向量的二维版本,它也要求所有数据具有相同的类型。如果我们将字符向量和数字向量组合成矩阵,则所有数据都将被强制转换为字符:
x = c("A", "B", "C")
y = c(1, 2, 3)
class(x)
## [1] "character"
class(y)
## [1] "numeric"
m = cbind(x, y)
m
## x y
## [1,] "A" "1"
## [2,] "B" "2"
## [3,] "C" "3"
引号表示数字向量已被强制转换为字符。或者,要使用不同数据类型的列存储数据,我们可以也使用数据框。
z = data.frame(x, y)
z
## x y
## 1 A 1
## 2 B 2
## 3 C 3
class(z[,1])
## [1] "character"
class(z[,2])
## [1] "numeric"
如果你已经设置了stringsAsFactors = FALSE,你会发现第一列仍然是字符,否则它将自动转换为一个因子。
options(stringsAsFactors=TRUE)
z = data.frame(x, y)
class(z[,1])
## [1] "factor"
矩阵和数据框之间的另一个区别是使用$
运算符选择列的能力:
m$x # error
z$x # ok
最基本数据结构是list
。列表允许将不同类型和不同长度的数据存储在单个对象中。列表的每个元素可以是任何其他R对象:任何类型的数据,任何数据结构,甚至其他列表或函数。
l = list(m, z)
ll = list(sublist=l, a_matrix=m, numeric_value=42, this_string="Hello World", even_a_function=cbind)
ll
## $sublist
## $sublist[[1]]
## x y
## [1,] "A" "1"
## [2,] "B" "2"
## [3,] "C" "3"
##
## $sublist[[2]]
## x y
## 1 A 1
## 2 B 2
## 3 C 3
##
##
## $a_matrix
## x y
## [1,] "A" "1"
## [2,] "B" "2"
## [3,] "C" "3"
##
## $numeric_value
## [1] 42
##
## $this_string
## [1] "Hello World"
##
## $even_a_function
## function (..., deparse.level = 1)
## .Internal(cbind(deparse.level, ...))
## <bytecode: 0x55aa107d6378>
## <environment: namespace:base>
当从不适合任何先前数据结构的函数返回大量结果时,列表最常用。
5.5
更多信息
通过键入?function
交互式会话,您可以获得有关与这些数据类型相关的任何R命令的更多信息
如果你对单细胞转录组研究感兴趣,但又不知道如何入门,也许你可以关注一下下面的课程
单细胞天地欢迎你
单细胞天地
生信技能树