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: 矩阵转为数据框