2.4 R 的数据结构

R 具有多种数据结构,了解 R 中常见的数据结构以及如何使用它们是至关重要的。

2.4.1 向量

向量是一个核心的数据结构。它可以理解为一个相同类型 (数字,字符或逻辑) 的元素列表。稍后你将看到表的每一列都将表示为向量。R 可以轻松直观地处理向量,可以用 c() 函数创建向量,但这不是唯一的方法。对向量的操作将作用于向量的所有元素。

x<-c(1,3,2,10,5) #创建含有5个元素的向量
x = c(1,3,2,10,5)
x
## [1] 1 3 2 10 5
y<-1:5 #创建一个包含5个连续整数的向量
y+2 #加法运算
## [1] 3 4 5 6 7
2*y #乘法运算
## [1] 2 4 6 8 10
y^2 #对每个元素平方运算
## [1] 1 4 9 16 25
2^y #对数字2进行对应元素的次方运算
## [1] 2 4 8 16 32
y #y 本身并不会被改变
## [1] 1 2 3 4 5
y<-y*2
y #此时y发生了变化
## [1] 2 4 6 8 10
r1<-rep(1,3) # 创造一个长度为3的向量
length(r1) #向量长度
## [1] 3
class(r1) # 向量类型
## [1] "numeric"
a<-1 # 实际这是一个长度为1的向量

2.4.2 矩阵

矩阵是指由行和列组成的数字数组。你可以将其视为向量的一个叠加版本,其中每行或每列都是向量。创建矩阵的最简单方法之一是使用 cbind() 组合相等长度的向量,其含义是 “通过列合并”。

x<-c(1,2,3,4)
y<-c(4,5,6,7)
m1<-cbind(x,y);m1
## x y
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
## [4,] 4 7
t(m1) #转置
## [,1] [,2] [,3] [,4]
## x 1 2 3 4
## y 4 5 6 7
dim(m1) # 返回对象维度
## [1] 4 2

你也可以直接列出元素并指定矩阵:

m2<-matrix(c(1,3,2,5,-1,2,2,3,9),nrow=3)
m2
## [,1] [,2] [,3]
## [1,] 1 5 2
## [2,] 3 -1 3
## [3,] 2 2 9

矩阵和另一个数据结构数据框都是是表格型的数据结构,你可以按需提取行和列提供给子集。图 2.1 显示了它们是如何工作的。

图 2.1: 从矩阵中提取子集

2.4.3 数据框(Data Frames)

数据框比框矩阵更加通用,因为不同列可以是不同的数据类型 (数字,字符,因子等)。可以通过 data.frame() 函数构造数据框。接下来我们说明了如何从基因组区段或者坐标构建数据框。

chr <- c("chr1", "chr1", "chr2", "chr2")
strand <- c("-","-","+","+")
start<- c(200,4000,100,400)
end<-c(250,410,200,450)
mydata <- data.frame(chr,start,end,strand)
#修改列名
names(mydata) <- c("chr","start","end","strand")
mydata
## chr start end strand
## 1 chr1 200 250 -
## 2 chr1 4000 410 -
## 3 chr2 100 200 +
## 4 chr2 400 450 +
# 另一种方法
mydata <- data.frame(chr=chr,start=start,end=end,strand=strand)
mydata
## chr start end strand
## 1 chr1 200 250 -
## 2 chr1 4000 410 -
## 3 chr2 100 200 +
## 4 chr2 400 450 +

有多种方法可以提取数据框的元素,你可以使用列数或列名来提取某些列,也可以使用行号提取某些行,还可以使用逻辑参数来提取数据,例如提取列中值大于某个阈值的所有行。

mydata[,2:4] # 提取2-4列
## start end strand
## 1 200 250 -
## 2 4000 410 -
## 3 100 200 +
## 4 400 450 +
mydata[,c("chr","start")] # 提取chr和start两列
## chr start
## 1 chr1 200
## 2 chr1 4000
## 3 chr2 100
## 4 chr2 400
mydata$start # 数据框中的start变量
## [1] 200 4000 100 400
mydata[c(1,3),] # 提取第一和第三行
## chr start end strand
## 1 chr1 200 250 -
## 3 chr2 100 200 +
mydata[mydata$start>400,] # 提取所有start大于400的行
## chr start end strand
## 2 chr1 4000 410 -

2.4.4 列表

列表可以理解为对象 (组件) 的有序集合。列表允许你收集各种 (可能不相关的) 对象。

# 具有4个成分的列表事例
# 字符串,数值向量,矩阵和标量
w <- list(name="Fred",
mynumbers=c(1,2,3),
mymatrix=matrix(1:4,ncol=2),
age=5.3)
w
## $name
## [1] "Fred"
##
## $mynumbers
## [1] 1 2 3
##
## $mymatrix
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
##
## $age
## [1] 5.3

您可以使用 [] 用列表中的位置或名称提取列表的元素。

w[[3]] # 列表的第三个元素
## [,1] [,2]
## [1,] 1 3
## [2,] 2 4
w[["mynumbers"]] # 名字为 mynumbers 的元素
## [1] 1 2 3
w$age
## [1] 5.3

2.4.5 因子

因子用于存储分类数据,它们对于统计建模很重要,因为分类变量在统计模型中与连续变量会被区别对待。这确保了在统计模型中可以正确地处理分类数据。

features=c("promoter","exon","intron")
f.feat=factor(features)

需要注意的一点是,当你使用read.table() 来读取数据框或者使用 data.frame() 来创造数据框时,字符列默认被存储为因子,如果想要修改这个默认设置可以在这两个函数中设定 stringsasfactor = FALSE

译者注:R 4.0 版本开始,默认设置已经为 stringsasfactor = FALSE