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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_R语言中怎么把matrix中的NA去掉

创建形式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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数据_02

创建形式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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_赋值_03

创建形式4:仅指定大小,不赋值

m <- matrix(nrow = 2, ncol = 3)
m

## [,1] [,2] [,3]
## [1,] NA NA NA
## [2,] NA NA NA

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_R语言中怎么把matrix中的NA去掉_04

创建形式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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_R语言中怎么把matrix中的NA去掉_05

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数组_06

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数据_07

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数组_08

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_赋值_09

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_R语言中怎么把matrix中的NA去掉_10

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_赋值_11

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_R语言中怎么把matrix中的NA去掉_12

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数组_13

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_R语言中怎么把matrix中的NA去掉_14

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数据_15

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_赋值_16

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数组_17

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_赋值_18

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_R语言中怎么把matrix中的NA去掉_19

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数据_20

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_赋值_21

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数据_22

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_赋值_23

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数据_24

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数据_25

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数组_26

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数据_27

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_赋值_28

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_R语言中怎么把matrix中的NA去掉_29

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_赋值_30

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_R语言中怎么把matrix中的NA去掉_31

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_R语言中怎么把matrix中的NA去掉_32

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_R语言中怎么把matrix中的NA去掉_33

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数据_34

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_赋值_35

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数据_36

0010-列表

列表的概念

  • 在R语言中,向量、矩阵和数组的元素要求必须是同一类型的数据,在使用过程中,可能一个数据对象需要保存不同类型的数据,则可以使用列表list来实现。
  • 列表是对象的集合,可以包含向量、矩阵、数组、数据框,甚至是另外一个列表,且在列表中要求每个成分都要有一个名称。
  • 列表中的对象又称为它的分量components。

1. 创建列表

a <- list(姓名 = "张三", 工资 = 1800, 性别 = "男")
a

## $姓名
## [1] "张三"
##
## $工资
## [1] 1800
##
## $性别
## [1] "男"

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数据_37

a <- list(姓名 = c("张三","李四"), 工资 = c(1800,2800), 性别 = c("男","女"))
a

## $姓名
## [1] "张三" "李四"
##
## $工资
## [1] 1800 2800
##
## $性别
## [1] "男" "女"

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_R语言中怎么把matrix中的NA去掉_38

a <- list(c("张三","李四"), c(1800,2800), c("男","女"))
a

## [[1]]
## [1] "张三" "李四"
##
## [[2]]
## [1] 1800 2800
##
## [[3]]
## [1] "男" "女"

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_R语言中怎么把matrix中的NA去掉_39

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_R语言中怎么把matrix中的NA去掉_40

2. 列表的索引

  • 直接索引

a[[1]]

## [1] "张三" "李四" "王五"

typeof(a[[1]])

## [1] "character"

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数组_41

a[1]

## $姓名
## [1] "张三" "李四" "王五"

typeof(a[1])

## [1] "list"

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数据_42

a[1:2]

## $姓名
## [1] "张三" "李四" "王五"
##
## $科目
## [1] "语文" "数学" "英语" "物理" "计算机"

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数据_43

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_赋值_44

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数组_45

  • 名称索引

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

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数组_46

a$姓名

## [1] "张三" "李四" "王五"

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数据_47

a$成绩

## [,1] [,2] [,3] [,4] [,5]
## [1,] 91 35 37 97 90
## [2,] 92 56 39 93 80
## [3,] 7 6 33 9 53

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数据_48

a['姓名']

## $姓名
## [1] "张三" "李四" "王五"

a[['姓名']]

## [1] "张三" "李四" "王五"

R语言中怎么把matrix中的NA去掉 r语言中matrix作用_数组_49

二级索引

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根据男女,是否成年拆成了四组