Chapter 3 R data structure

3.1 数据存储方式

数据类型。numeric / character / logical     
向量(Vector)。一维,存储同一数据类型         
矩阵(Matrix)。二维或三维,存储同一数据类型      
列表(List)。多维,存储不同数据类型        
数据框(Dataframe)。多维,存储不同数据类型,变量长度相同     

3.2 创建和访问数据

访问方式:索引、名字、条件

  • 向量:只存储相同类型的元素。
# 创建向量
x <- c(1, 2, 3, 4, 5)
x
## [1] 1 2 3 4 5
names(x)
## NULL
names(x) <- letters[1:5]

# 访问向量
x[1]
## a 
## 1
x[2:3]
## b c 
## 2 3
x[c('a', 'b')]
## a b 
## 1 2
x[x <= 2]
## a b 
## 1 2
  • 矩阵:只存储相同类型的元素。
# 创建矩阵
m1 = matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3)
m1
##      [,1] [,2] [,3]
## [1,]    1    4    7
## [2,]    2    5    8
## [3,]    3    6    9
colnames(m1) <- c('c1', 'c2', 'c3')
rownames(m1) <- c('r1', 'r2', 'r3')
m1
##    c1 c2 c3
## r1  1  4  7
## r2  2  5  8
## r3  3  6  9
# 访问矩阵
m1[1, 2]
## [1] 4
m1[1:2, 2:3]
##    c2 c3
## r1  4  7
## r2  5  8
m1[c('r1', 'r3'), c('c1', 'c2')]
##    c1 c2
## r1  1  4
## r3  3  6
# 向量和矩阵互相转换
# matrix: 向量转为矩阵
# as.vector: 矩阵转为向量
Notes:  
矩阵是用两个维度表示和访问的向量,本质仍然是向量。          
因此,也可以用向量的方式提取子集:`m1[1:7]`  
向量只包含相同类型的元素,矩阵也是如此。  
  • 列表:存储不同数据类型的元素。
# 创建列表
l1 = list(1, c(TRUE, FALSE), c('a', 'b', 'c'))
l1
## [[1]]
## [1] 1
## 
## [[2]]
## [1]  TRUE FALSE
## 
## [[3]]
## [1] "a" "b" "c"
names(l1)
## NULL
names(l1) <- LETTERS[1:3]
l1
## $A
## [1] 1
## 
## $B
## [1]  TRUE FALSE
## 
## $C
## [1] "a" "b" "c"
# 访问列表
## 提取列表成分,得到向量元素
l1$B
## [1]  TRUE FALSE
l1[[2]]
## [1]  TRUE FALSE
l1[['B']]
## [1]  TRUE FALSE
## 提取列表子集,得到列表子集
l1[2]
## $B
## [1]  TRUE FALSE
l1[2:3]
## $B
## [1]  TRUE FALSE
## 
## $C
## [1] "a" "b" "c"
l1['B']
## $B
## [1]  TRUE FALSE
l1[c('B', 'C')]
## $B
## [1]  TRUE FALSE
## 
## $C
## [1] "a" "b" "c"
# 向量和列表互相转换
# as.list / list: 向量转为列表
# unlist: 列表转为向量
  • 数据框

数据框存储不同数据类型的元素且变量长度相同。 数据框的每一列代表一个变量属性,每一行代表一条样本数据。 由列向量组成、有着矩阵形式的列表。

# 创建数据框
df <- data.frame(
  Name = c("Ken", "Ashley", "Jennifer"),
  Gender = c("Male", "Female", "Female"),
  Age = c(24, 25, 23),
  Major = c("Finance", "Statistics", "Computer Science")
)
df
##       Name Gender Age            Major
## 1      Ken   Male  24          Finance
## 2   Ashley Female  25       Statistics
## 3 Jennifer Female  23 Computer Science
# 访问数据框
# 数据框既是列表的特例,也是广义的矩阵,因此适用于这两类对象的访问方式

## 以列表方式提取数据框的元素、子集
df$Name
## [1] "Ken"      "Ashley"   "Jennifer"
df[[1]]
## [1] "Ken"      "Ashley"   "Jennifer"
df[1]
##       Name
## 1      Ken
## 2   Ashley
## 3 Jennifer
df[1:2]
##       Name Gender
## 1      Ken   Male
## 2   Ashley Female
## 3 Jennifer Female
## 以矩阵方式提取数据框
df[, 'Name']
## [1] "Ken"      "Ashley"   "Jennifer"
df[c(1:2), ]
##     Name Gender Age      Major
## 1    Ken   Male  24    Finance
## 2 Ashley Female  25 Statistics
df[c(1:2), c('Name', 'Gender')]
##     Name Gender
## 1    Ken   Male
## 2 Ashley Female
df[df$Age>=25, ]
##     Name Gender Age      Major
## 2 Ashley Female  25 Statistics
# 矩阵和数据框互相转换
# as.matrix: 数据框转为矩阵
# as.data.frame: 矩阵转为数据框