Tidyverse自学笔记

Tidyverse自学笔记

数据准备

本示例数据是自编数据,仅为练习所用,数据结构假设为,两个年份year(2020,2021),两个氮水平nitrogen(N1,N2),两个玉米品种variety(a,b)测定了5个试验指标(变量v1,v2,v3,v4,v5),每个处理3次重复block(1,2,3)。

library(tidyverse) # 调用tidyverse。

df <- read_csv(file = "df.csv") # 导入数据。文档在工作目录下,所以直接给文件名导入。

df # 查看数据。

## # A tibble: 24 × 9

## year nitrogen variety block v1 v2 v3 v4 v5

##

## 1 2020 N1 a 1 1.26 2.14 0.4 5 3.25

## 2 2020 N1 a 2 1.2 2.9 0.1 5.3 1.27

## 3 2020 N1 a 3 1.3 3 0.3 5.6 2.24

## 4 2020 N1 b 1 1.08 1.72 1.8 2.8 1

## 5 2020 N1 b 2 1.05 1.65 1.7 2.5 3.12

## 6 2020 N1 b 3 1.15 1.35 1.5 3.1 4.57

## 7 2020 N2 a 1 1.32 3.78 1.6 6 5.85

## 8 2020 N2 a 2 1.28 4.32 1.4 6.1 6.48

## 9 2020 N2 a 3 1.35 3.95 1.3 6.2 7.21

## 10 2020 N2 b 1 1.33 3.47 2.8 4.1 6.56

## # … with 14 more rows

6.1.2 列增减

Base R

通过搜索学习,学习到基础包中我认为可以增删列的方法:

通过索引赋值增加列,通过反向索引来删除列;

通过transform函数中对列的赋实现列的增删,赋NULL,删除列,赋具体的数字,增加列。

subset函数用于提取子集,只要我们提取了想要的子集,也相当于删除了不想要的列;

data.frame函数可以实现在原数据框基础上增加新列,构建新的数据框。

cbind函数用于连接数据框,可通过次函数将原数据框和含新列的数据框连接实现增加列。

最后,我认为还有一个笨办法就是通过edit函数调出原始数据,通过数据录入增加列。

下面一一尝试一下。

1、索引增删列

df$v6 <- 1:24 # 增加新列v6,数值为1到24。

df # 查看增加后的数据集。

## # A tibble: 24 × 10

## year nitrogen variety block v1 v2 v3 v4 v5 v6

##

## 1 2020 N1 a 1 1.26 2.14 0.4 5 3.25 1

## 2 2020 N1 a 2 1.2 2.9 0.1 5.3 1.27 2

## 3 2020 N1 a 3 1.3 3 0.3 5.6 2.24 3

## 4 2020 N1 b 1 1.08 1.72 1.8 2.8 1 4

## 5 2020 N1 b 2 1.05 1.65 1.7 2.5 3.12 5

## 6 2020 N1 b 3 1.15 1.35 1.5 3.1 4.57 6

## 7 2020 N2 a 1 1.32 3.78 1.6 6 5.85 7

## 8 2020 N2 a 2 1.28 4.32 1.4 6.1 6.48 8

## 9 2020 N2 a 3 1.35 3.95 1.3 6.2 7.21 9

## 10 2020 N2 b 1 1.33 3.47 2.8 4.1 6.56 10

## # … with 14 more rows

df[, -10] # 删除新增的第10列。

## # A tibble: 24 × 9

## year nitrogen variety block v1 v2 v3 v4 v5

##

## 1 2020 N1 a 1 1.26 2.14 0.4 5 3.25

## 2 2020 N1 a 2 1.2 2.9 0.1 5.3 1.27

## 3 2020 N1 a 3 1.3 3 0.3 5.6 2.24

## 4 2020 N1 b 1 1.08 1.72 1.8 2.8 1

## 5 2020 N1 b 2 1.05 1.65 1.7 2.5 3.12

## 6 2020 N1 b 3 1.15 1.35 1.5 3.1 4.57

## 7 2020 N2 a 1 1.32 3.78 1.6 6 5.85

## 8 2020 N2 a 2 1.28 4.32 1.4 6.1 6.48

## 9 2020 N2 a 3 1.35 3.95 1.3 6.2 7.21

## 10 2020 N2 b 1 1.33 3.47 2.8 4.1 6.56

## # … with 14 more rows

2、transform函数增删列

transform(df, v6 = 1:24) # 增加v6列。

## year nitrogen variety block v1 v2 v3 v4 v5 v6

## 1 2020 N1 a 1 1.26 2.14 0.4 5.0 3.25 1

## 2 2020 N1 a 2 1.20 2.90 0.1 5.3 1.27 2

## 3 2020 N1 a 3 1.30 3.00 0.3 5.6 2.24 3

## 4 2020 N1 b 1 1.08 1.72 1.8 2.8 1.00 4

## 5 2020 N1 b 2 1.05 1.65 1.7 2.5 3.12 5

## 6 2020 N1 b 3 1.15 1.35 1.5 3.1 4.57 6

## 7 2020 N2 a 1 1.32 3.78 1.6 6.0 5.85 7

## 8 2020 N2 a 2 1.28 4.32 1.4 6.1 6.48 8

## 9 2020 N2 a 3 1.35 3.95 1.3 6.2 7.21 9

## 10 2020 N2 b 1 1.33 3.47 2.8 4.1 6.56 10

## 11 2020 N2 b 2 1.28 2.72 2.4 4.3 8.43 11

## 12 2020 N2 b 3 1.30 3.90 2.2 4.5 7.55 12

## 13 2021 N1 a 1 1.19 3.61 0.8 6.0 3.11 13

## 14 2021 N1 a 2 1.21 3.29 0.5 5.7 2.54 14

## 15 2021 N1 a 3 1.24 3.26 0.7 5.6 1.28 15

## 16 2021 N1 b 1 1.09 2.71 1.8 4.0 3.24 16

## 17 2021 N1 b 2 1.28 2.32 1.6 4.2 1.27 17

## 18 2021 N1 b 3 1.35 1.95 1.3 4.3 1.15 18

## 19 2021 N2 a 1 1.45 4.35 1.8 7.2 5.74 19

## 20 2021 N2 a 2 1.40 3.80 1.2 7.0 6.85 20

## 21 2021 N2 a 3 1.37 4.23 1.6 6.8 7.42 21

## 22 2021 N2 b 1 1.28 2.72 2.4 5.1 8.20 22

## 23 2021 N2 b 2 1.15 3.35 2.5 5.5 5.70 23

## 24 2021 N2 b 3 1.24 3.46 2.7 4.9 6.00 24

transform(df, v6 = NULL) # 删除v6列。

## year nitrogen variety block v1 v2 v3 v4 v5

## 1 2020 N1 a 1 1.26 2.14 0.4 5.0 3.25

## 2 2020 N1 a 2 1.20 2.90 0.1 5.3 1.27

## 3 2020 N1 a 3 1.30 3.00 0.3 5.6 2.24

## 4 2020 N1 b 1 1.08 1.72 1.8 2.8 1.00

## 5 2020 N1 b 2 1.05 1.65 1.7 2.5 3.12

## 6 2020 N1 b 3 1.15 1.35 1.5 3.1 4.57

## 7 2020 N2 a 1 1.32 3.78 1.6 6.0 5.85

## 8 2020 N2 a 2 1.28 4.32 1.4 6.1 6.48

## 9 2020 N2 a 3 1.35 3.95 1.3 6.2 7.21

## 10 2020 N2 b 1 1.33 3.47 2.8 4.1 6.56

## 11 2020 N2 b 2 1.28 2.72 2.4 4.3 8.43

## 12 2020 N2 b 3 1.30 3.90 2.2 4.5 7.55

## 13 2021 N1 a 1 1.19 3.61 0.8 6.0 3.11

## 14 2021 N1 a 2 1.21 3.29 0.5 5.7 2.54

## 15 2021 N1 a 3 1.24 3.26 0.7 5.6 1.28

## 16 2021 N1 b 1 1.09 2.71 1.8 4.0 3.24

## 17 2021 N1 b 2 1.28 2.32 1.6 4.2 1.27

## 18 2021 N1 b 3 1.35 1.95 1.3 4.3 1.15

## 19 2021 N2 a 1 1.45 4.35 1.8 7.2 5.74

## 20 2021 N2 a 2 1.40 3.80 1.2 7.0 6.85

## 21 2021 N2 a 3 1.37 4.23 1.6 6.8 7.42

## 22 2021 N2 b 1 1.28 2.72 2.4 5.1 8.20

## 23 2021 N2 b 2 1.15 3.35 2.5 5.5 5.70

## 24 2021 N2 b 3 1.24 3.46 2.7 4.9 6.00

3、subset提取删除列

subset(df, select = -v6) # 删除df数据集v6列。

## # A tibble: 24 × 9

## year nitrogen variety block v1 v2 v3 v4 v5

##

## 1 2020 N1 a 1 1.26 2.14 0.4 5 3.25

## 2 2020 N1 a 2 1.2 2.9 0.1 5.3 1.27

## 3 2020 N1 a 3 1.3 3 0.3 5.6 2.24

## 4 2020 N1 b 1 1.08 1.72 1.8 2.8 1

## 5 2020 N1 b 2 1.05 1.65 1.7 2.5 3.12

## 6 2020 N1 b 3 1.15 1.35 1.5 3.1 4.57

## 7 2020 N2 a 1 1.32 3.78 1.6 6 5.85

## 8 2020 N2 a 2 1.28 4.32 1.4 6.1 6.48

## 9 2020 N2 a 3 1.35 3.95 1.3 6.2 7.21

## 10 2020 N2 b 1 1.33 3.47 2.8 4.1 6.56

## # … with 14 more rows

subset(df, select = year:v1) # 只保留了1到5列,去除了不想要的列。

## # A tibble: 24 × 5

## year nitrogen variety block v1

##

## 1 2020 N1 a 1 1.26

## 2 2020 N1 a 2 1.2

## 3 2020 N1 a 3 1.3

## 4 2020 N1 b 1 1.08

## 5 2020 N1 b 2 1.05

## 6 2020 N1 b 3 1.15

## 7 2020 N2 a 1 1.32

## 8 2020 N2 a 2 1.28

## 9 2020 N2 a 3 1.35

## 10 2020 N2 b 1 1.33

## # … with 14 more rows

subset(df, select = c(1:6,8)) # 通过subset选择子集。

## # A tibble: 24 × 7

## year nitrogen variety block v1 v2 v4

##

## 1 2020 N1 a 1 1.26 2.14 5

## 2 2020 N1 a 2 1.2 2.9 5.3

## 3 2020 N1 a 3 1.3 3 5.6

## 4 2020 N1 b 1 1.08 1.72 2.8

## 5 2020 N1 b 2 1.05 1.65 2.5

## 6 2020 N1 b 3 1.15 1.35 3.1

## 7 2020 N2 a 1 1.32 3.78 6

## 8 2020 N2 a 2 1.28 4.32 6.1

## 9 2020 N2 a 3 1.35 3.95 6.2

## 10 2020 N2 b 1 1.33 3.47 4.1

## # … with 14 more rows

4、data.frame函数增加列

data.frame(df, v7 = 1:24) # data.frame函数增加列。

## year nitrogen variety block v1 v2 v3 v4 v5 v6 v7

## 1 2020 N1 a 1 1.26 2.14 0.4 5.0 3.25 1 1

## 2 2020 N1 a 2 1.20 2.90 0.1 5.3 1.27 2 2

## 3 2020 N1 a 3 1.30 3.00 0.3 5.6 2.24 3 3

## 4 2020 N1 b 1 1.08 1.72 1.8 2.8 1.00 4 4

## 5 2020 N1 b 2 1.05 1.65 1.7 2.5 3.12 5 5

## 6 2020 N1 b 3 1.15 1.35 1.5 3.1 4.57 6 6

## 7 2020 N2 a 1 1.32 3.78 1.6 6.0 5.85 7 7

## 8 2020 N2 a 2 1.28 4.32 1.4 6.1 6.48 8 8

## 9 2020 N2 a 3 1.35 3.95 1.3 6.2 7.21 9 9

## 10 2020 N2 b 1 1.33 3.47 2.8 4.1 6.56 10 10

## 11 2020 N2 b 2 1.28 2.72 2.4 4.3 8.43 11 11

## 12 2020 N2 b 3 1.30 3.90 2.2 4.5 7.55 12 12

## 13 2021 N1 a 1 1.19 3.61 0.8 6.0 3.11 13 13

## 14 2021 N1 a 2 1.21 3.29 0.5 5.7 2.54 14 14

## 15 2021 N1 a 3 1.24 3.26 0.7 5.6 1.28 15 15

## 16 2021 N1 b 1 1.09 2.71 1.8 4.0 3.24 16 16

## 17 2021 N1 b 2 1.28 2.32 1.6 4.2 1.27 17 17

## 18 2021 N1 b 3 1.35 1.95 1.3 4.3 1.15 18 18

## 19 2021 N2 a 1 1.45 4.35 1.8 7.2 5.74 19 19

## 20 2021 N2 a 2 1.40 3.80 1.2 7.0 6.85 20 20

## 21 2021 N2 a 3 1.37 4.23 1.6 6.8 7.42 21 21

## 22 2021 N2 b 1 1.28 2.72 2.4 5.1 8.20 22 22

## 23 2021 N2 b 2 1.15 3.35 2.5 5.5 5.70 23 23

## 24 2021 N2 b 3 1.24 3.46 2.7 4.9 6.00 24 24

tidyverse

tidyverse包中add_column可实现列的增加,且可以指定位置。

mutate函数可以增加列。

select函数反选可以实现删除列,只需在不需要的列名前加“-”。另外,我认为通过正向选择想要的列,去除不想要的列,也实现了列删除。

add_column() 增加列。

add_column(df, v7 = 1:24, .before = "v5") # 在v5列前面增加新列v7。

## # A tibble: 24 × 11

## year nitrogen variety block v1 v2 v3 v4 v7 v5 v6

##

## 1 2020 N1 a 1 1.26 2.14 0.4 5 1 3.25 1

## 2 2020 N1 a 2 1.2 2.9 0.1 5.3 2 1.27 2

## 3 2020 N1 a 3 1.3 3 0.3 5.6 3 2.24 3

## 4 2020 N1 b 1 1.08 1.72 1.8 2.8 4 1 4

## 5 2020 N1 b 2 1.05 1.65 1.7 2.5 5 3.12 5

## 6 2020 N1 b 3 1.15 1.35 1.5 3.1 6 4.57 6

## 7 2020 N2 a 1 1.32 3.78 1.6 6 7 5.85 7

## 8 2020 N2 a 2 1.28 4.32 1.4 6.1 8 6.48 8

## 9 2020 N2 a 3 1.35 3.95 1.3 6.2 9 7.21 9

## 10 2020 N2 b 1 1.33 3.47 2.8 4.1 10 6.56 10

## # … with 14 more rows

mutate增删列。

df %>% mutate(new = 5) # 增加新列,新列的每个值都是5。

## # A tibble: 24 × 11

## year nitrogen variety block v1 v2 v3 v4 v5 v6 new

##

## 1 2020 N1 a 1 1.26 2.14 0.4 5 3.25 1 5

## 2 2020 N1 a 2 1.2 2.9 0.1 5.3 1.27 2 5

## 3 2020 N1 a 3 1.3 3 0.3 5.6 2.24 3 5

## 4 2020 N1 b 1 1.08 1.72 1.8 2.8 1 4 5

## 5 2020 N1 b 2 1.05 1.65 1.7 2.5 3.12 5 5

## 6 2020 N1 b 3 1.15 1.35 1.5 3.1 4.57 6 5

## 7 2020 N2 a 1 1.32 3.78 1.6 6 5.85 7 5

## 8 2020 N2 a 2 1.28 4.32 1.4 6.1 6.48 8 5

## 9 2020 N2 a 3 1.35 3.95 1.3 6.2 7.21 9 5

## 10 2020 N2 b 1 1.33 3.47 2.8 4.1 6.56 10 5

## # … with 14 more rows

df %>% mutate(new = 1:24) # 增加新列,列值为1到24。

## # A tibble: 24 × 11

## year nitrogen variety block v1 v2 v3 v4 v5 v6 new

##

## 1 2020 N1 a 1 1.26 2.14 0.4 5 3.25 1 1

## 2 2020 N1 a 2 1.2 2.9 0.1 5.3 1.27 2 2

## 3 2020 N1 a 3 1.3 3 0.3 5.6 2.24 3 3

## 4 2020 N1 b 1 1.08 1.72 1.8 2.8 1 4 4

## 5 2020 N1 b 2 1.05 1.65 1.7 2.5 3.12 5 5

## 6 2020 N1 b 3 1.15 1.35 1.5 3.1 4.57 6 6

## 7 2020 N2 a 1 1.32 3.78 1.6 6 5.85 7 7

## 8 2020 N2 a 2 1.28 4.32 1.4 6.1 6.48 8 8

## 9 2020 N2 a 3 1.35 3.95 1.3 6.2 7.21 9 9

## 10 2020 N2 b 1 1.33 3.47 2.8 4.1 6.56 10 10

## # … with 14 more rows

df %>% mutate(new = v1*10) # 增加新列,新列的值是v1的10倍。

## # A tibble: 24 × 11

## year nitrogen variety block v1 v2 v3 v4 v5 v6 new

##

## 1 2020 N1 a 1 1.26 2.14 0.4 5 3.25 1 12.6

## 2 2020 N1 a 2 1.2 2.9 0.1 5.3 1.27 2 12

## 3 2020 N1 a 3 1.3 3 0.3 5.6 2.24 3 13

## 4 2020 N1 b 1 1.08 1.72 1.8 2.8 1 4 10.8

## 5 2020 N1 b 2 1.05 1.65 1.7 2.5 3.12 5 10.5

## 6 2020 N1 b 3 1.15 1.35 1.5 3.1 4.57 6 11.5

## 7 2020 N2 a 1 1.32 3.78 1.6 6 5.85 7 13.2

## 8 2020 N2 a 2 1.28 4.32 1.4 6.1 6.48 8 12.8

## 9 2020 N2 a 3 1.35 3.95 1.3 6.2 7.21 9 13.5

## 10 2020 N2 b 1 1.33 3.47 2.8 4.1 6.56 10 13.3

## # … with 14 more rows

df %>% mutate(v2 = NULL) # 可以通过对列赋值NULL删除列。

## # A tibble: 24 × 9

## year nitrogen variety block v1 v3 v4 v5 v6

##

## 1 2020 N1 a 1 1.26 0.4 5 3.25 1

## 2 2020 N1 a 2 1.2 0.1 5.3 1.27 2

## 3 2020 N1 a 3 1.3 0.3 5.6 2.24 3

## 4 2020 N1 b 1 1.08 1.8 2.8 1 4

## 5 2020 N1 b 2 1.05 1.7 2.5 3.12 5

## 6 2020 N1 b 3 1.15 1.5 3.1 4.57 6

## 7 2020 N2 a 1 1.32 1.6 6 5.85 7

## 8 2020 N2 a 2 1.28 1.4 6.1 6.48 8

## 9 2020 N2 a 3 1.35 1.3 6.2 7.21 9

## 10 2020 N2 b 1 1.33 2.8 4.1 6.56 10

## # … with 14 more rows

select函数删除列

df %>% select(-v5) # 删除v5列。

## # A tibble: 24 × 9

## year nitrogen variety block v1 v2 v3 v4 v6

##

## 1 2020 N1 a 1 1.26 2.14 0.4 5 1

## 2 2020 N1 a 2 1.2 2.9 0.1 5.3 2

## 3 2020 N1 a 3 1.3 3 0.3 5.6 3

## 4 2020 N1 b 1 1.08 1.72 1.8 2.8 4

## 5 2020 N1 b 2 1.05 1.65 1.7 2.5 5

## 6 2020 N1 b 3 1.15 1.35 1.5 3.1 6

## 7 2020 N2 a 1 1.32 3.78 1.6 6 7

## 8 2020 N2 a 2 1.28 4.32 1.4 6.1 8

## 9 2020 N2 a 3 1.35 3.95 1.3 6.2 9

## 10 2020 N2 b 1 1.33 3.47 2.8 4.1 10

## # … with 14 more rows

df %>% select(everything(), -starts_with("v")) # 删除列名首字母为v的列。

## # A tibble: 24 × 3

## year nitrogen block

##

## 1 2020 N1 1

## 2 2020 N1 2

## 3 2020 N1 3

## 4 2020 N1 1

## 5 2020 N1 2

## 6 2020 N1 3

## 7 2020 N2 1

## 8 2020 N2 2

## 9 2020 N2 3

## 10 2020 N2 1

## # … with 14 more rows

df %>% select(year:block,v5) # 选择df数据集1到4列和v5列。

## # A tibble: 24 × 5

## year nitrogen variety block v5

##

## 1 2020 N1 a 1 3.25

## 2 2020 N1 a 2 1.27

## 3 2020 N1 a 3 2.24

## 4 2020 N1 b 1 1

## 5 2020 N1 b 2 3.12

## 6 2020 N1 b 3 4.57

## 7 2020 N2 a 1 5.85

## 8 2020 N2 a 2 6.48

## 9 2020 N2 a 3 7.21

## 10 2020 N2 b 1 6.56

## # … with 14 more rows

参考资料

R语言编程—基于 tidyverse,人民邮电出版社(待出版),2022.

R语言教程,李东风,https://www.math.pku.edu.cn/teachers/lidf/docs/Rbook/html/_Rbook/index.html

R语言 subset()用法及代码示例,https://vimsky.com/examples/usage/create-subsets-of-a-data-frame-in-r-programming-subset-function.html

R语言 transform()用法及代码示例,https://vimsky.com/examples/usage/modify-values-of-a-data-frame-in-r-language-transform-function.html

相关推荐