数据准备
本示例数据是自编数据,仅为练习所用,数据结构假设为,两个年份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
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 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
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
## 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
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 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
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 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
## <dbl> <chr> <chr> <dbl> <dbl>
## 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
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl>
## 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
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <int> <dbl> <int>
## 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
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int> <dbl>
## 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
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int> <int>
## 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
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <int> <dbl>
## 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
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
## 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
## <dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <int>
## 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
## <dbl> <chr> <dbl>
## 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
## <dbl> <chr> <chr> <dbl> <dbl>
## 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