0007-矩阵-矩阵中元素的访问
矩阵概念
- 在R语言中,矩阵Matrix是将数据按行和列组织的一种数据对象,相当于二维数组,可以用于描述二维的数据
- 与向量相似,矩阵的每个元素都拥有相同的数据类型。通常用列来表示来自不同变量的数据,用行来表示相同特性的数据
R语言中矩阵的创建
创建形式1:指定行数
m <- matrix(1:20, nrow = 4)
m
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 10 14 18
## [3,] 3 7 11 15 19
## [4,] 4 8 12 16 20
a <- matrix(1:20, nrow = 6)
# 注意!这里进行了循环补齐 # 且抛出一个warning!
a
## Warning in matrix(1:20, nrow = 6): 数据长度[20]不是矩阵行数[6]的整倍
## [,1] [,2] [,3] [,4]
## [1,] 1 7 13 19
## [2,] 2 8 14 20
## [3,] 3 9 15 1
## [4,] 4 10 16 2
## [5,] 5 11 17 3
## [6,] 6 12 18 4
创建形式2:指定列数
m <- matrix(1:20, ncol = 4)
m
## [,1] [,2] [,3] [,4]
## [1,] 1 6 11 16
## [2,] 2 7 12 17
## [3,] 3 8 13 18
## [4,] 4 9 14 19
## [5,] 5 10 15 20
m <- matrix(1:20, ncol = 6)
## Warning in matrix(1:20, ncol = 6): 数据长度[20]不是矩阵列数[6]的整倍数
m
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 5 9 13 17 1
## [2,] 2 6 10 14 18 2
## [3,] 3 7 11 15 19 3
## [4,] 4 8 12 16 20 4
创建形式3:赋值同时给行和列命名
m <- matrix(c(1:20),
nrow = 4,
ncol = 5,
dimnames = list(c('r1','r2','r3','r4'),
c('c1','c2','c3','c4','c5')))
m
## c1 c2 c3 c4 c5
## r1 1 5 9 13 17
## r2 2 6 10 14 18
## r3 3 7 11 15 19
## r4 4 8 12 16 20
创建形式4:仅指定大小,不赋值
m <- matrix(nrow = 2, ncol = 3)
m
## [,1] [,2] [,3]
## [1,] NA NA NA
## [2,] NA NA NA
创建形式5:使用rbind或者cbind组合构建
- rbind:将两个向量/矩阵按照行合并为一个矩阵
- cbind:将两个向量/矩阵按照列合并为一个矩阵
a <- c(1:4)
b <- c(4:7)
m <- rbind(a,b)
m
## [,1] [,2] [,3] [,4]
## a 1 2 3 4
## b 4 5 6 7
a <- c(1:4)
b <- c(4:7)
m <- cbind(a,b)
m
## a b
## [1,] 1 4
## [2,] 2 5
## [3,] 3 6
## [4,] 4 7
m1 <- matrix(1:8, nrow = 2)
m2 <- matrix(2:9, nrow = 2)
m1
## [,1] [,2] [,3] [,4]
## [1,] 1 3 5 7
## [2,] 2 4 6 8
m2
## [,1] [,2] [,3] [,4]
## [1,] 2 4 6 8
## [2,] 3 5 7 9
m <- rbind(m1,m2)
m
## [,1] [,2] [,3] [,4]
## [1,] 1 3 5 7
## [2,] 2 4 6 8
## [3,] 2 4 6 8
## [4,] 3 5 7 9
m <- cbind(m1,m2)
m
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
## [1,] 1 3 5 7 2 4 6 8
## [2,] 2 4 6 8 3 5 7 9
1. 通过位置引用
m
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
## [1,] 1 3 5 7 2 4 6 8
## [2,] 2 4 6 8 3 5 7 9
m[2,3]
## [1] 6
m[2,]
## [1] 2 4 6 8 3 5 7 9
m[,8]
## [1] 8 9
m[3] # 第三个元素
## [1] 3
2. 通过名称引用
m <- matrix(c(1:20),
nrow = 4,
ncol = 5,
dimnames = list(c('r1','r2','r3','r4'),
c('c1','c2','c3','c4','c5')))
m
## c1 c2 c3 c4 c5
## r1 1 5 9 13 17
## r2 2 6 10 14 18
## r3 3 7 11 15 19
## r4 4 8 12 16 20
m['r1','c5']
## [1] 17
m['r2',]
## c1 c2 c3 c4 c5
## 2 6 10 14 18
m[,'c2']
## r1 r2 r3 r4
## 5 6 7 8
3. 通过删除方式访问
# 排除第1行和第3列
m[-1,-3]
## c1 c2 c4 c5
## r2 2 6 14 18
## r3 3 7 15 19
## r4 4 8 16 20
m[-1,]
## c1 c2 c3 c4 c5
## r2 2 6 10 14 18
## r3 3 7 11 15 19
## r4 4 8 12 16 20
m[,-2]
## c1 c3 c4 c5
## r1 1 9 13 17
## r2 2 10 14 18
## r3 3 11 15 19
## r4 4 12 16 20
4. 通过向量引用
m[c(1,2),c(4,5)]
## c4 c5
## r1 13 17
## r2 14 18
m[c(1:3),c(2:4)]
## c2 c3 c4
## r1 5 9 13
## r2 6 10 14
## r3 7 11 15
m[c(3,4),]
## c1 c2 c3 c4 c5
## r3 3 7 11 15 19
## r4 4 8 12 16 20
m[,c(2:5)]
## c2 c3 c4 c5
## r1 5 9 13 17
## r2 6 10 14 18
## r3 7 11 15 19
## r4 8 12 16 20
m[,c(2,5,4)]
## c2 c5 c4
## r1 5 17 13
## r2 6 18 14
## r3 7 19 15
## r4 8 20 16
m[-c(2,3),]
## c1 c2 c3 c4 c5
## r1 1 5 9 13 17
## r4 4 8 12 16 20
m['r3',c('c2','c1')]
## c2 c1
## 7 3
0008-矩阵-矩阵的编辑
1. 修改矩阵元素的值
m <- matrix(1:20,
nrow = 4,
ncol = 5,
dimnames = list(c("A","B","C","D"),
c("a","b","c","d","e")))
m
## a b c d e
## A 1 5 9 13 17
## B 2 6 10 14 18
## C 3 7 11 15 19
## D 4 8 12 16 20
m[4,5] = 666
m
## a b c d e
## A 1 5 9 13 17
## B 2 6 10 14 18
## C 3 7 11 15 19
## D 4 8 12 16 666
m['A','e'] = 777
m
## a b c d e
## A 1 5 9 13 777
## B 2 6 10 14 18
## C 3 7 11 15 19
## D 4 8 12 16 666
m[1,] = c(11,22,33,44,55)
m
## a b c d e
## A 11 22 33 44 55
## B 2 6 10 14 18
## C 3 7 11 15 19
## D 4 8 12 16 666
m[,'a'] = c(33,44,55,66)
m
## a b c d e
## A 33 22 33 44 55
## B 44 6 10 14 18
## C 55 7 11 15 19
## D 66 8 12 16 666
2. 删除指定的行或列
m <- m[-3,]
m
## a b c d e
## A 33 22 33 44 55
## B 44 6 10 14 18
## D 66 8 12 16 666
m <- m[,-2]
m
## a c d e
## A 33 33 44 55
## B 44 10 14 18
## D 66 12 16 666
3. 矩阵的合并
之前介绍过了rbind和cbind
m1 <- matrix(1:20, nrow = 4)
m2 <- matrix(31:50,nrow = 4)
m1
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 10 14 18
## [3,] 3 7 11 15 19
## [4,] 4 8 12 16 20
m2
## [,1] [,2] [,3] [,4] [,5]
## [1,] 31 35 39 43 47
## [2,] 32 36 40 44 48
## [3,] 33 37 41 45 49
## [4,] 34 38 42 46 50
m <- rbind(m1,m2)
m
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 10 14 18
## [3,] 3 7 11 15 19
## [4,] 4 8 12 16 20
## [5,] 31 35 39 43 47
## [6,] 32 36 40 44 48
## [7,] 33 37 41 45 49
## [8,] 34 38 42 46 50
m <- cbind(m1,m2)
m
## [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
## [1,] 1 5 9 13 17 31 35 39 43 47
## [2,] 2 6 10 14 18 32 36 40 44 48
## [3,] 3 7 11 15 19 33 37 41 45 49
## [4,] 4 8 12 16 20 34 38 42 46 50
m <- rbind(m1,c(111,222))
m
## Warning in rbind(m1, c(111, 222)): number of columns of result is not a multiple ## of vector length (arg 2)
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 10 14 18
## [3,] 3 7 11 15 19
## [4,] 4 8 12 16 20
## [5,] 111 222 111 222 111
m <- cbind(m1,100)
m
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 5 9 13 17 100
## [2,] 2 6 10 14 18 100
## [3,] 3 7 11 15 19 100
## [4,] 4 8 12 16 20 100
0009-数组
数组的定义
- 在R语言中,可以认为数组是矩阵的扩展,它将矩阵扩展到2维以上
- 如果给定的数组是1维的则相当于向量,2维的相当于矩阵
- R语言中的数组元素的类型也是单一的,可以是数值型、逻辑型、字符型或复数型
1. 创建数组
a <- array(1:10)
a
## [1] 1 2 3 4 5 6 7 8 9 10
a <- array(1:24, dim = c(4,6))
a
## [,1] [,2] [,3] [,4] [,5] [,6]
## [1,] 1 5 9 13 17 21
## [2,] 2 6 10 14 18 22
## [3,] 3 7 11 15 19 23
## [4,] 4 8 12 16 20 24
a <- array(1:24, dim = c(4,5,3))
a
## , , 1
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 10 14 18
## [3,] 3 7 11 15 19
## [4,] 4 8 12 16 20
##
## , , 2
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 21 1 5 9 13
## [2,] 22 2 6 10 14
## [3,] 23 3 7 11 15
## [4,] 24 4 8 12 16
##
## , , 3
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 17 21 1 5 9
## [2,] 18 22 2 6 10
## [3,] 19 23 3 7 11
## [4,] 20 24 4 8 12
name <- c("刘能","赵四","广坤","大脚")
score <- c("数学","物理","化学","计算机","英语")
times <- c("测验","期中","期末")
a <- array(sample(1:100,60,replace=TRUE),
dim = c(4,5,3),
dimnames = list(name,score,times))
a
## , , 测验
##
## 数学 物理 化学 计算机 英语
## 刘能 88 47 66 98 32
## 赵四 63 37 51 23 55
## 广坤 31 21 10 67 43
## 大脚 55 11 27 27 6
##
## , , 期中
##
## 数学 物理 化学 计算机 英语
## 刘能 12 29 70 3 26
## 赵四 58 38 39 32 63
## 广坤 63 70 54 81 75
## 大脚 84 65 59 25 69
##
## , , 期末
##
## 数学 物理 化学 计算机 英语
## 刘能 52 64 49 75 47
## 赵四 57 91 100 43 87
## 广坤 62 32 91 36 28
## 大脚 18 6 30 81 84
2. 数组的索引
a <- array(1:60, dim = c(4,5,3))
a
## , , 1
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 10 14 18
## [3,] 3 7 11 15 19
## [4,] 4 8 12 16 20
##
## , , 2
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 21 25 29 33 37
## [2,] 22 26 30 34 38
## [3,] 23 27 31 35 39
## [4,] 24 28 32 36 40
##
## , , 3
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 41 45 49 53 57
## [2,] 42 46 50 54 58
## [3,] 43 47 51 55 59
## [4,] 44 48 52 56 60
a[3,2,3]
## [1] 47
a[1,3,]
## [1] 9 29 49
a[3,,]
## [,1] [,2] [,3]
## [1,] 3 23 43
## [2,] 7 27 47
## [3,] 11 31 51
## [4,] 15 35 55
## [5,] 19 39 59
a[,5,]
## [,1] [,2] [,3]
## [1,] 17 37 57
## [2,] 18 38 58
## [3,] 19 39 59
## [4,] 20 40 60
a[1:3,c(1,3),]
## , , 1
##
## [,1] [,2]
## [1,] 1 9
## [2,] 2 10
## [3,] 3 11
##
## , , 2
##
## [,1] [,2]
## [1,] 21 29
## [2,] 22 30
## [3,] 23 31
##
## , , 3
##
## [,1] [,2]
## [1,] 41 49
## [2,] 42 50
## [3,] 43 51
3. 数组的编辑
- 修改元素的值
- 删除元素
a
## , , 1
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 10 14 18
## [3,] 3 7 11 15 19
## [4,] 4 8 12 16 20
##
## , , 2
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 21 25 29 33 37
## [2,] 22 26 30 34 38
## [3,] 23 27 31 35 39
## [4,] 24 28 32 36 40
##
## , , 3
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 41 45 49 53 57
## [2,] 42 46 50 54 58
## [3,] 43 47 51 55 59
## [4,] 44 48 52 56 60
a[2,3,1] <- 18
a
## , , 1
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 18 14 18
## [3,] 3 7 11 15 19
## [4,] 4 8 12 16 20
##
## , , 2
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 21 25 29 33 37
## [2,] 22 26 30 34 38
## [3,] 23 27 31 35 39
## [4,] 24 28 32 36 40
##
## , , 3
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 41 45 49 53 57
## [2,] 42 46 50 54 58
## [3,] 43 47 51 55 59
## [4,] 44 48 52 56 60
a[2,3,] <- 18
a
## , , 1
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 18 14 18
## [3,] 3 7 11 15 19
## [4,] 4 8 12 16 20
##
## , , 2
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 21 25 29 33 37
## [2,] 22 26 18 34 38
## [3,] 23 27 31 35 39
## [4,] 24 28 32 36 40
##
## , , 3
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 41 45 49 53 57
## [2,] 42 46 18 54 58
## [3,] 43 47 51 55 59
## [4,] 44 48 52 56 60
a[,3,] <- 66
a
## , , 1
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 66 13 17
## [2,] 2 6 66 14 18
## [3,] 3 7 66 15 19
## [4,] 4 8 66 16 20
##
## , , 2
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 21 25 66 33 37
## [2,] 22 26 66 34 38
## [3,] 23 27 66 35 39
## [4,] 24 28 66 36 40
##
## , , 3
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 41 45 66 53 57
## [2,] 42 46 66 54 58
## [3,] 43 47 66 55 59
## [4,] 44 48 66 56 60
a[,,3] <- 100
a
## , , 1
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 66 13 17
## [2,] 2 6 66 14 18
## [3,] 3 7 66 15 19
## [4,] 4 8 66 16 20
##
## , , 2
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 21 25 66 33 37
## [2,] 22 26 66 34 38
## [3,] 23 27 66 35 39
## [4,] 24 28 66 36 40
##
## , , 3
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 100 100 100 100 100
## [2,] 100 100 100 100 100
## [3,] 100 100 100 100 100
## [4,] 100 100 100 100 100
a <- a[,,-3]
a
## , , 1
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 66 13 17
## [2,] 2 6 66 14 18
## [3,] 3 7 66 15 19
## [4,] 4 8 66 16 20
##
## , , 2
##
## [,1] [,2] [,3] [,4] [,5]
## [1,] 21 25 66 33 37
## [2,] 22 26 66 34 38
## [3,] 23 27 66 35 39
## [4,] 24 28 66 36 40
4. 数组的常用运算
-
-
-
- /
-
-
a <- array(1:24, dim = c(2,3,4))
b <- array(24:1, dim = c(2,3,4))
a
## , , 1
##
## [,1] [,2] [,3]
## [1,] 1 3 5
## [2,] 2 4 6
##
## , , 2
##
## [,1] [,2] [,3]
## [1,] 7 9 11
## [2,] 8 10 12
##
## , , 3
##
## [,1] [,2] [,3]
## [1,] 13 15 17
## [2,] 14 16 18
##
## , , 4
##
## [,1] [,2] [,3]
## [1,] 19 21 23
## [2,] 20 22 24
b
## , , 1
##
## [,1] [,2] [,3]
## [1,] 24 22 20
## [2,] 23 21 19
##
## , , 2
##
## [,1] [,2] [,3]
## [1,] 18 16 14
## [2,] 17 15 13
##
## , , 3
##
## [,1] [,2] [,3]
## [1,] 12 10 8
## [2,] 11 9 7
##
## , , 4
##
## [,1] [,2] [,3]
## [1,] 6 4 2
## [2,] 5 3 1
a+b
## , , 1
##
## [,1] [,2] [,3]
## [1,] 25 25 25
## [2,] 25 25 25
##
## , , 2
##
## [,1] [,2] [,3]
## [1,] 25 25 25
## [2,] 25 25 25
##
## , , 3
##
## [,1] [,2] [,3]
## [1,] 25 25 25
## [2,] 25 25 25
##
## , , 4
##
## [,1] [,2] [,3]
## [1,] 25 25 25
## [2,] 25 25 25
a-b
## , , 1
##
## [,1] [,2] [,3]
## [1,] -23 -19 -15
## [2,] -21 -17 -13
##
## , , 2
##
## [,1] [,2] [,3]
## [1,] -11 -7 -3
## [2,] -9 -5 -1
##
## , , 3
##
## [,1] [,2] [,3]
## [1,] 1 5 9
## [2,] 3 7 11
##
## , , 4
##
## [,1] [,2] [,3]
## [1,] 13 17 21
## [2,] 15 19 23
a*b
## , , 1
##
## [,1] [,2] [,3]
## [1,] 24 66 100
## [2,] 46 84 114
##
## , , 2
##
## [,1] [,2] [,3]
## [1,] 126 144 154
## [2,] 136 150 156
##
## , , 3
##
## [,1] [,2] [,3]
## [1,] 156 150 136
## [2,] 154 144 126
##
## , , 4
##
## [,1] [,2] [,3]
## [1,] 114 84 46
## [2,] 100 66 24
a/b
## , , 1
##
## [,1] [,2] [,3]
## [1,] 0.04166667 0.1363636 0.2500000
## [2,] 0.08695652 0.1904762 0.3157895
##
## , , 2
##
## [,1] [,2] [,3]
## [1,] 0.3888889 0.5625000 0.7857143
## [2,] 0.4705882 0.6666667 0.9230769
##
## , , 3
##
## [,1] [,2] [,3]
## [1,] 1.083333 1.500000 2.125000
## [2,] 1.272727 1.777778 2.571429
##
## , , 4
##
## [,1] [,2] [,3]
## [1,] 3.166667 5.250000 11.5
## [2,] 4.000000 7.333333 24.0
0010-列表
列表的概念
- 在R语言中,向量、矩阵和数组的元素要求必须是同一类型的数据,在使用过程中,可能一个数据对象需要保存不同类型的数据,则可以使用列表list来实现。
- 列表是对象的集合,可以包含向量、矩阵、数组、数据框,甚至是另外一个列表,且在列表中要求每个成分都要有一个名称。
- 列表中的对象又称为它的分量components。
1. 创建列表
a <- list(姓名 = "张三", 工资 = 1800, 性别 = "男")
a
## $姓名
## [1] "张三"
##
## $工资
## [1] 1800
##
## $性别
## [1] "男"
a <- list(姓名 = c("张三","李四"), 工资 = c(1800,2800), 性别 = c("男","女"))
a
## $姓名
## [1] "张三" "李四"
##
## $工资
## [1] 1800 2800
##
## $性别
## [1] "男" "女"
a <- list(c("张三","李四"), c(1800,2800), c("男","女"))
a
## [[1]]
## [1] "张三" "李四"
##
## [[2]]
## [1] 1800 2800
##
## [[3]]
## [1] "男" "女"
a <- list(姓名 = c("张三","李四","王五"),
科目 = c("语文","数学","英语","物理","计算机"),
成绩 = matrix(sample(1:100,15), nrow = 3))
a
## $姓名
## [1] "张三" "李四" "王五"
##
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
2. 列表的索引
- 直接索引
a[[1]]
## [1] "张三" "李四" "王五"
typeof(a[[1]])
## [1] "character"
a[1]
## $姓名
## [1] "张三" "李四" "王五"
typeof(a[1])
## [1] "list"
a[1:2]
## $姓名
## [1] "张三" "李四" "王五"
##
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
a[c(1,3)]
## $姓名
## [1] "张三" "李四" "王五"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
a[-1]
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
- 名称索引
a
## $姓名
## [1] "张三" "李四" "王五"
##
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
a$姓名
## [1] "张三" "李四" "王五"
a$成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
a['姓名']
## $姓名
## [1] "张三" "李四" "王五"
a[['姓名']]
## [1] "张三" "李四" "王五"
-
二级索引
a
## $姓名
## [1] "张三" "李四" "王五"
##
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
a[1]
## $姓名
## [1] "张三" "李四" "王五"
a[1][1]
## $姓名
## [1] "张三" "李四" "王五"
typeof(a[1][1])
## [1] "list"
a[1][[1]]
## [1] "张三" "李四" "王五"
typeof(a[1][[1]])
## [1] "character"
a[[1]][1]
## [1] "张三"
typeof(a[[1]])
## [1] "character"
a$姓名
## [1] "张三" "李四" "王五"
a$姓名[1]
## [1] "张三"
typeof(a$姓名[1])
## [1] "character"
3. 列表的编辑
- 修改某个成分的元素值
a
## $姓名
## [1] "张三" "李四" "王五"
##
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
a[[1]][1] <- "小明"
a
## $姓名
## [1] "小明" "李四" "王五"
##
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
其他的引用方式来重新赋值也是可以的,都一样
a$姓名 <- "小米"
a
## $姓名
## [1] "小米"
##
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
a$姓名 <- c('test','john','xx')
a
## $姓名
## [1] "test" "john" "xx"
##
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
- 修改成分的整个值
a
## $姓名
## [1] "test" "john" "xx"
##
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
a[[1]] # 是个vector
## [1] "test" "john" "xx"
a[[1]] <- c('aa', 'bnb')
a
## $姓名
## [1] "aa" "bnb"
##
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
a$姓名 <- c('xx','dd')
a
## $姓名
## [1] "xx" "dd"
##
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
a[1]
## $姓名
## [1] "xx" "dd"
typeof(a[1]) # vector不能赋值给list,只有list能赋值给list,看下面的例子
## [1] "list"
a[1] <- c('test','test2)
a
## 抛出错误
a[1] <- list(c('test','test2'))
a
## $姓名
## [1] "test" "test2"
##
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
- 修改多个成分值
a
## $姓名
## [1] "test" "test2"
##
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
a[c(1,2)] <- c(list(c('a','b')),
list(c('maths','computer')))
a
## $姓名
## [1] "a" "b"
##
## $科目
## [1] "maths" "computer"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
- 添加成分
a
## $姓名
## [1] "a" "b"
##
## $科目
## [1] "maths" "computer"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
a$地址 <- c('Tianjin','Shanghai')
a
## $姓名
## [1] "a" "b"
##
## $科目
## [1] "maths" "computer"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53
##
## $地址
## [1] "Tianjin" "Shanghai"
a <- list(姓名 = c("张三","李四","王五"),
科目 = c("语文","数学","英语","物理","计算机"),
成绩 = matrix(sample(1:100,15), nrow = 3))
a
## $姓名
## [1] "张三" "李四" "王五"
##
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 50 32 63 77 39
## [2,] 82 84 55 27 34
## [3,] 24 45 8 19 61
a <- c(a,
list(电话 = c(111111,222222)))
a
## $姓名
## [1] "张三" "李四" "王五"
##
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 50 32 63 77 39
## [2,] 82 84 55 27 34
## [3,] 24 45 8 19 61
##
## $电话
## [1] 111111 222222
a <- list(a,
list(电话 = c(111111,222222)))
a # 这样就是a变成了list,里面的元素是2个list
## [[1]]
## [[1]]$姓名
## [1] "张三" "李四" "王五"
##
## [[1]]$科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## [[1]]$成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 50 32 63 77 39
## [2,] 82 84 55 27 34
## [3,] 24 45 8 19 61
##
## [[1]]$电话
## [1] 111111 222222
##
##
## [[2]]
## [[2]]$电话
## [1] 111111 222222
- 删除成分
a <- list(姓名 = c("张三","李四","王五"),
科目 = c("语文","数学","英语","物理","计算机"),
成绩 = matrix(sample(1:100,15), nrow = 3))
a
## $姓名
## [1] "张三" "李四" "王五"
##
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 85 19 59 11 54
## [2,] 74 6 10 21 75
## [3,] 31 65 72 7 28
a$姓名 <- NULL
a
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"
##
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 85 19 59 11 54
## [2,] 74 6 10 21 75
## [3,] 31 65 72 7 28
a['科目'] <- NULL
a
## $成绩
## [,1] [,2] [,3] [,4] [,5]
## [1,] 85 19 59 11 54
## [2,] 74 6 10 21 75
## [3,] 31 65 72 7 28
a[1] <- NULL
a
## named list()
## 变成了空list
0011-数据框Dataframe
数据框Dataframe的概念
- 数据库Dataframe组织数据的结构与矩阵相似
- 各列的数据类型可以不相同
- 数据框IDE每列是一个变量,每行是一个观测样本
- 每列长度必须相同
1. 创建Dataframe
df <- data.frame(姓名 = c("张三","李四","王五"),
成绩 = c(66,77,88),
籍贯 = c("天津","北京","广州"))
df
## 姓名 成绩 籍贯
## 1 张三 66 天津
## 2 李四 77 北京
## 3 王五 88 广州
df <- data.frame(姓名 = c("张三","李四","王五"),
成绩 = c(66,77,88),
籍贯 = c("天津","北京","广州"),
row.names = c("row1","row2","row3"))
df
## 姓名 成绩 籍贯
## row1 张三 66 天津
## row2 李四 77 北京
## row3 王五 88 广州
df <- data.frame(姓名 = c("张三","李四","王五"),
成绩 = c(66,77,88),
籍贯 = c("天津","北京","广州"))
row.names(df) <- c("row1","row2","row3")
df
## 姓名 成绩 籍贯
## row1 张三 66 天津
## row2 李四 77 北京
## row3 王五 88 广州
name <- c("张三","李四","王五")
sex <- c("男","女","男")
age <- c(14,16,17)
df <- data.frame(name,sex,age)
df
## name sex age
## 1 张三 男 14
## 2 李四 女 16
## 3 王五 男 17
可以发现col.names自动定义为vector的名称
ls1 <- list(name = name,
sex = sex,
age = age)
ls1
## $name
## [1] "张三" "李四" "王五"
##
## $sex
## [1] "男" "女" "男"
##
## $age
## [1] 14 16 17
df <- as.data.frame(ls1)
df
## name sex age
## 1 张三 男 14
## 2 李四 女 16
## 3 王五 男 17
上述用法可以将list转换为Dataframe
a <- array(1:20,c(4,5))
a
## [,1] [,2] [,3] [,4] [,5]
## [1,] 1 5 9 13 17
## [2,] 2 6 10 14 18
## [3,] 3 7 11 15 19
## [4,] 4 8 12 16 20
b <- as.data.frame(a)
b
## V1 V2 V3 V4 V5
## 1 1 5 9 13 17
## 2 2 6 10 14 18
## 3 3 7 11 15 19
## 4 4 8 12 16 20
row.names(b) <- c('a','b','c','d')
b
## V1 V2 V3 V4 V5
## a 1 5 9 13 17
## b 2 6 10 14 18
## c 3 7 11 15 19
## d 4 8 12 16 20
a <- array(1:15, c(3,5), dimnames = list(c('r1','r2','r3'), c('c1','c2','c3','c4','c5')))
a
## c1 c2 c3 c4 c5
## r1 1 4 7 10 13
## r2 2 5 8 11 14
## r3 3 6 9 12 15
df <- as.data.frame(a)
df
## c1 c2 c3 c4 c5
## r1 1 4 7 10 13
## r2 2 5 8 11 14
## r3 3 6 9 12 15
a <- matrix(1:20, nrow = 5)
a
## [,1] [,2] [,3] [,4]
## [1,] 1 6 11 16
## [2,] 2 7 12 17
## [3,] 3 8 13 18
## [4,] 4 9 14 19
## [5,] 5 10 15 20
b <- as.data.frame(a)
b
## V1 V2 V3 V4
## 1 1 6 11 16
## 2 2 7 12 17
## 3 3 8 13 18
## 4 4 9 14 19
## 5 5 10 15 20
a <- matrix(1:21, nrow = 3, dimnames = list(c('r1','r2','r3')))
a
## [,1] [,2] [,3] [,4] [,5] [,6] [,7]
## r1 1 4 7 10 13 16 19
## r2 2 5 8 11 14 17 20
## r3 3 6 9 12 15 18 21
b <- as.data.frame(a)
b
## V1 V2 V3 V4 V5 V6 V7
## r1 1 4 7 10 13 16 19
## r2 2 5 8 11 14 17 20
## r3 3 6 9 12 15 18 21
colnames(b) <- c(1,2,3,4,5,6,7)
b
## 1 2 3 4 5 6 7
## r1 1 4 7 10 13 16 19
## r2 2 5 8 11 14 17 20
## r3 3 6 9 12 15 18 21
a <- matrix(1:21, nrow = 3, dimnames = list(c(),c('c1','c2','c3','c4','c5','c6','c7')))
b <- as.data.frame(a)
b
## c1 c2 c3 c4 c5 c6 c7
## 1 1 4 7 10 13 16 19
## 2 2 5 8 11 14 17 20
## 3 3 6 9 12 15 18 21
2. Dataframe的引用
df <- data.frame(姓名 = c('张三','李四','王五'),
成绩 = c(66,77,88),
籍贯 = c('天津','北京','广州'))
df
## 姓名 成绩 籍贯
## 1 张三 66 天津
## 2 李四 77 北京
## 3 王五 88 广州
df[2,]
## 姓名 成绩 籍贯
## 2 李四 77 北京
df[,2]
## [1] 66 77 88
class(df[2,])
## [1] "data.frame"
class(df[,2])
## [1] "numeric"
class(df[,1])
## [1] "factor"
class(df[,3])
## [1] "factor"
df[1:2,]
## 姓名 成绩 籍贯
## 1 张三 66 天津
## 2 李四 77 北京
df[c(3,1),]
## 姓名 成绩 籍贯
## 3 王五 88 广州
## 1 张三 66 天津
df[1,2]
## [1] 66
df['姓名'] # 取Dataframe
## 姓名
## 1 张三
## 2 李四
## 3 王五
class(df['姓名'])
## [1] "data.frame"
df[['姓名']] # 取factor
## [1] 张三 李四 王五
## Levels: 李四 王五 张三
class(df[['姓名']])
## [1] "factor"
df[,'姓名'] # 取factor
## [1] 张三 李四 王五
## Levels: 李四 王五 张三
class(df[,'姓名'])
## [1] "factor"
df$姓名 # 取factor
## [1] 张三 李四 王五
## Levels: 李四 王五 张三
class(df$姓名)
## [1] "factor"
如何访问元素?
df
## 姓名 成绩 籍贯
## 1 张三 66 天津
## 2 李四 77 北京
## 3 王五 88 广州
df[1,1]
## [1] 张三
## Levels: 李四 王五 张三
df[[1]][1]
## [1] 张三
## Levels: 李四 王五 张三
df$姓名[1]
## [1] 张三
## Levels: 李四 王五 张三
3. Dataframe的增删改
- 行:rbind
- 列:cbind, data.frame
df
## 姓名 成绩 籍贯
## 1 张三 66 天津
## 2 李四 77 北京
## 3 王五 88 广州
ls1 <- list("赵四",100,"辽宁")
df <- rbind(df, ls1)
## 抛出错误
## 因子层次有错,产生了NA因子层次有错,产生了NA
df2 <- data.frame(姓名 = c('张三','李四','王五'),
成绩 = c(66,77,88),
籍贯 = c('天津','北京','广州'),
stringsAsFactors = FALSE)
ls1 <- list("赵四",100,"辽宁")
df2 <- rbind(df2,ls1)
df2
## 姓名 成绩 籍贯
## 1 张三 66 天津
## 2 李四 77 北京
## 3 王五 88 广州
## 4 赵四 100 辽宁
ls2 <- list('男','男','女','女')
df2 <- cbind(df2, ls2)
df2
## 姓名 成绩 籍贯 "男" "男" "女" "女"
## 1 张三 66 天津 男 男 女 女
## 2 李四 77 北京 男 男 女 女
## 3 王五 88 广州 男 男 女 女
## 4 赵四 100 辽宁 男 男 女 女
出问题了!
应该这么写
df2 <- data.frame(姓名 = c('张三','李四','王五'),
成绩 = c(66,77,88),
籍贯 = c('天津','北京','广州'),
stringsAsFactors = FALSE)
ls1 <- list("赵四",100,"辽宁")
df2 <- rbind(df2,ls1)
ls2 <- list(性别=c('男','男','女','女'))
df2 <- cbind(df2, ls2)
df2
## 姓名 成绩 籍贯 性别
## 1 张三 66 天津 男
## 2 李四 77 北京 男
## 3 王五 88 广州 女
## 4 赵四 100 辽宁 女
class(df$成绩)
## [1] "numeric"
df[1,2] <- '33'
df
## 姓名 成绩 籍贯
## 1 张三 33 天津
## 2 李四 77 北京
## 3 王五 88 广州
class(df$成绩)
## [1] "character"
df[1,2] <- 22
df
## 姓名 成绩 籍贯
## 1 张三 22 天津
## 2 李四 77 北京
## 3 王五 88 广州
class(df$成绩)
## [1] "character"
就是说,如果numeric中修改为string之后,所有的number都会转换为string!
df2$姓名[2]
## [1] "李四"
df2$姓名[2] <- c("哈哈")
df2 # 想这么操作必须定义Dataframe的时候stringAsFactor=FALSE
## 姓名 成绩 籍贯 性别
## 1 张三 66 天津 男
## 2 哈哈 77 北京 男
## 3 王五 88 广州 女
## 4 赵四 100 辽宁 女
接下来展示如何删除行列,使用减号即可
df2
## 姓名 成绩 籍贯 性别
## 1 张三 66 天津 男
## 2 哈哈 77 北京 男
## 3 王五 88 广州 女
## 4 赵四 100 辽宁 女
df2 <- df2[-3]
df2
## 姓名 成绩 性别
## 1 张三 66 男
## 2 哈哈 77 男
## 3 王五 88 女
## 4 赵四 100 女
df2 <- df2[-1,]
df2
## 姓名 成绩 性别
## 2 哈哈 77 男
## 3 王五 88 女
## 4 赵四 100 女
df2 <- df2[,-3]
df2
## 姓名 成绩
## 2 哈哈 77
## 3 王五 88
## 4 赵四 100
同样的,也可以指定向量值来删除行列值
df3 <- df2[,c(-2,-3)]
df3
## [1] "哈哈" "王五" "赵四"
class(df3)
## [1] "character"
上面直接变成了string的形式,如何保持Dataframe呢
df3 <- df2[,c(-2,-3),drop=FALSE]
df3
## 姓名
## 2 哈哈
## 3 王五
## 4 赵四
这样就可以了 看一下,发现不存在的第三列也是可以指定删除的,这里只删除了第2列,drop=FALSE可以保留原来的数据格式Dataframe
df
## 姓名 成绩 籍贯
## 1 张三 22 天津
## 2 李四 77 北京
## 3 王五 88 广州
df <- df[-2,-2]
df
## 姓名 籍贯
## 1 张三 天津
## 3 王五 广州
可以看到这里是分别删除了行和列
0012-因子
定义因子与插入值
city <- c("天津","北京","广州","天津","上海","北京","广州","天津")
cityFactor <- factor(city)
cityFactor
## [1] 天津 北京 广州 天津 上海 北京 广州 天津
## Levels: 北京 广州 上海 天津
因子内不同的数值即为水平
str(cityFactor)
## Factor w/ 4 levels "北京","广州",..: 4 1 2 4 3 1 2 4
length(cityFactor)
## [1] 8
因子长度是数据的长度,而不是水平的个数
city <- c("天津","北京","广州","天津","上海","北京","广州")
city
## [1] "天津" "北京" "广州" "天津" "上海" "北京" "广州"
f <- factor(city)
f
## [1] 天津 北京 广州 天津 上海 北京 广州
## Levels: 北京 广州 上海 天津
str(f)
## Factor w/ 4 levels "北京","广州",..: 4 1 2 4 3 1 2
length(f)
## [1] 7
f[2] <- "深圳"
## Warning in `[<-.factor`(`*tmp*`, 2, value = "深圳"): invalid factor level, NA
## generated
f
## [1] 天津 <NA> 广州 天津 上海 北京 广州
## Levels: 北京 广州 上海 天津
发现抛出warning,而且并没有修改成功第二个元素而是给了一个NA值
也就是说 如果想要修改一个因子,那么它一定是在level中存在的,不存在level中的字符串不可赋值给因子,且抛出warning并且赋值一个因子NA
但是如果修改为已存在的值,是可以成功修改的
f[2] <- "广州"
f
## [1] 天津 广州 广州 天津 上海 北京 广州
## Levels: 北京 广州 上海 天津
广州这个level存在,所以可以修改成功
除此之外,还可以在创建factor的时候指定一个level
f <- factor(city,levels = c("天津","北京","上海","深圳"))
f
## [1] 天津 北京 <NA> 天津 上海 北京 <NA>
## Levels: 天津 北京 上海 深圳
然后现在由于深圳在level中,所以可以赋值,用深圳来填充第3,7个factor
f[3] <- "深圳"
f[7] <- "石家庄"
## Warning in `[<-.factor`(`*tmp*`, 7, value = "石家庄"): invalid factor level, NA
## generated
f
## [1] 天津 北京 深圳 天津 上海 北京 <NA>
## Levels: 天津 北京 上海 深圳
可以看到,第3个成功填充,第7个失败了,因为石家庄不在level里
tapply()函数
语法形式:
# tapply(x,f,g)
# x: 向量
# f: 因子
# g: 函数
操作形式: 将x按照f的因子进行分组,并针对分组应用g函数
hours为加班时间,使用tapply函数将name处理为因子,计算每个人的加班时间和
hours <- c(2,4,1,3,4,6,2,4)
name <- c("xiaoming","cuihua","liuneng","xiaoming","zhaosi","cuihua","cuihua","xiaoming")
tapply(hours, name, sum)
## cuihua liuneng xiaoming zhaosi
## 12 1 9 4
tapply(hours, name, max)
## cuihua liuneng xiaoming zhaosi
## 6 1 4 4
从年龄和性别分组来使用tapply
demo <- data.frame(list(gender=c("male",'female','female','male','male','female','male'),
age = c(11,19,22,10,9,25,35),
hours=c(3,2,1,4,5,2,1)))
demo
## gender age hours
## 1 male 11 3
## 2 female 19 2
## 3 female 22 1
## 4 male 10 4
## 5 male 9 5
## 6 female 25 2
## 7 male 35 1
给年龄分层
demo$ifAdult <- ifelse(demo$age > 18, "Adult","Child")
demo
## gender age hours ifAdult
## 1 male 11 3 Child
## 2 female 19 2 Adult
## 3 female 22 1 Adult
## 4 male 10 4 Child
## 5 male 9 5 Child
## 6 female 25 2 Adult
## 7 male 35 1 Adult
tapply(demo$hours, list(demo$gender, demo$ifAdult), mean)
## Adult Child
## female 1.666667 NA
## male 1.000000 4
这里的意思是,对demo$hours这个向量做处理,然后根据index性别和index是否成年来分组,取均值,可见,既为女性又是陈年人的平均hours为1.6666667,既为女性又是未成年的hours值不存在,既为男性又是成年的hours平均为1,即使男性又是未成年的hours平均值为4 共分成了四组,因为gender有两种可能,ifAdult也是两种可能,所以组合为2*2
split()函数
demo
## gender age hours ifAdult
## 1 male 11 3 Child
## 2 female 19 2 Adult
## 3 female 22 1 Adult
## 4 male 10 4 Child
## 5 male 9 5 Child
## 6 female 25 2 Adult
## 7 male 35 1 Adult
然后
split(demo, list(demo$gender,demo$ifAdult))
## $female.Adult
## gender age hours ifAdult
## 2 female 19 2 Adult
## 3 female 22 1 Adult
## 6 female 25 2 Adult
##
## $male.Adult
## gender age hours ifAdult
## 7 male 35 1 Adult
##
## $female.Child
## [1] gender age hours ifAdult
## <0 rows> (or 0-length row.names)
##
## $male.Child
## gender age hours ifAdult
## 1 male 11 3 Child
## 4 male 10 4 Child
## 5 male 9 5 Child
理解为pandas的groupby,根据index分成几组
这里给的是Dataframe,也可以输入列来查看单独列的拆分
split(demo$hours, demo$ifAdult)
## $Adult
## [1] 2 1 2 1
##
## $Child
## [1] 3 4 5
可见hours根据ifAdult分成了两组
或者根据两个index来拆分
split(demo$hours, list(demo$gender,demo$ifAdult))
## $female.Adult
## [1] 2 1 2
##
## $male.Adult
## [1] 1
##
## $female.Child
## numeric(0)
##
## $male.Child
## [1] 3 4 5
这里把hours根据男女,是否成年拆成了四组