Chapter 3 R data structure
3.1 数据存储方式
数据类型。numeric / character / logical
向量(Vector)。一维,存储同一数据类型
矩阵(Matrix)。二维或三维,存储同一数据类型
列表(List)。多维,存储不同数据类型
数据框(Dataframe)。多维,存储不同数据类型,变量长度相同
3.2 创建和访问数据
访问方式:索引、名字、条件
- 向量:只存储相同类型的元素。
# 创建向量
<- c(1, 2, 3, 4, 5)
x x
## [1] 1 2 3 4 5
names(x)
## NULL
names(x) <- letters[1:5]
# 访问向量
1] x[
## a
## 1
2:3] x[
## b c
## 2 3
c('a', 'b')] x[
## a b
## 1 2
<= 2] x[x
## a b
## 1 2
- 矩阵:只存储相同类型的元素。
# 创建矩阵
= matrix(c(1, 2, 3, 4, 5, 6, 7, 8, 9), nrow = 3)
m1 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
# 访问矩阵
1, 2] m1[
## [1] 4
1:2, 2:3] m1[
## c2 c3
## r1 4 7
## r2 5 8
c('r1', 'r3'), c('c1', 'c2')] m1[
## c1 c2
## r1 1 4
## r3 3 6
# 向量和矩阵互相转换
# matrix: 向量转为矩阵
# as.vector: 矩阵转为向量
Notes:
矩阵是用两个维度表示和访问的向量,本质仍然是向量。
因此,也可以用向量的方式提取子集:`m1[1:7]`
向量只包含相同类型的元素,矩阵也是如此。
- 列表:存储不同数据类型的元素。
# 创建列表
= list(1, c(TRUE, FALSE), c('a', 'b', 'c'))
l1 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"
# 访问列表
## 提取列表成分,得到向量元素
$B l1
## [1] TRUE FALSE
2]] l1[[
## [1] TRUE FALSE
'B']] l1[[
## [1] TRUE FALSE
## 提取列表子集,得到列表子集
2] l1[
## $B
## [1] TRUE FALSE
2:3] l1[
## $B
## [1] TRUE FALSE
##
## $C
## [1] "a" "b" "c"
'B'] l1[
## $B
## [1] TRUE FALSE
c('B', 'C')] l1[
## $B
## [1] TRUE FALSE
##
## $C
## [1] "a" "b" "c"
# 向量和列表互相转换
# as.list / list: 向量转为列表
# unlist: 列表转为向量
- 数据框
数据框存储不同数据类型的元素且变量长度相同。 数据框的每一列代表一个变量属性,每一行代表一条样本数据。 由列向量组成、有着矩阵形式的列表。
# 创建数据框
<- data.frame(
df 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
# 访问数据框
# 数据框既是列表的特例,也是广义的矩阵,因此适用于这两类对象的访问方式
## 以列表方式提取数据框的元素、子集
$Name df
## [1] "Ken" "Ashley" "Jennifer"
1]] df[[
## [1] "Ken" "Ashley" "Jennifer"
1] df[
## Name
## 1 Ken
## 2 Ashley
## 3 Jennifer
1:2] df[
## Name Gender
## 1 Ken Male
## 2 Ashley Female
## 3 Jennifer Female
## 以矩阵方式提取数据框
'Name'] df[,
## [1] "Ken" "Ashley" "Jennifer"
c(1:2), ] df[
## Name Gender Age Major
## 1 Ken Male 24 Finance
## 2 Ashley Female 25 Statistics
c(1:2), c('Name', 'Gender')] df[
## Name Gender
## 1 Ken Male
## 2 Ashley Female
$Age>=25, ] df[df
## Name Gender Age Major
## 2 Ashley Female 25 Statistics
# 矩阵和数据框互相转换
# as.matrix: 数据框转为矩阵
# as.data.frame: 矩阵转为数据框