数据准备
本示例数据是自编数据,仅为练习所用,数据结构假设为,两个年份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.3 列排序
Base R
搜索学习了一下,在Base R中通过索引去实现列序的改变。
df[,c(2,4,1,3,5:9)] # 改变df数据集列序,新的列顺序是原来的df第2和第4列提前。
## # A tibble: 24 × 9
## nitrogen block year variety v1 v2 v3 v4 v5
## <chr> <dbl> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 N1 1 2020 a 1.26 2.14 0.4 5 3.25
## 2 N1 2 2020 a 1.2 2.9 0.1 5.3 1.27
## 3 N1 3 2020 a 1.3 3 0.3 5.6 2.24
## 4 N1 1 2020 b 1.08 1.72 1.8 2.8 1
## 5 N1 2 2020 b 1.05 1.65 1.7 2.5 3.12
## 6 N1 3 2020 b 1.15 1.35 1.5 3.1 4.57
## 7 N2 1 2020 a 1.32 3.78 1.6 6 5.85
## 8 N2 2 2020 a 1.28 4.32 1.4 6.1 6.48
## 9 N2 3 2020 a 1.35 3.95 1.3 6.2 7.21
## 10 N2 1 2020 b 1.33 3.47 2.8 4.1 6.56
## # … with 14 more rows
subset(df, select = c(2,4,1,3,5:9)) # 利用subset函数选择排序。
## # A tibble: 24 × 9
## nitrogen block year variety v1 v2 v3 v4 v5
## <chr> <dbl> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 N1 1 2020 a 1.26 2.14 0.4 5 3.25
## 2 N1 2 2020 a 1.2 2.9 0.1 5.3 1.27
## 3 N1 3 2020 a 1.3 3 0.3 5.6 2.24
## 4 N1 1 2020 b 1.08 1.72 1.8 2.8 1
## 5 N1 2 2020 b 1.05 1.65 1.7 2.5 3.12
## 6 N1 3 2020 b 1.15 1.35 1.5 3.1 4.57
## 7 N2 1 2020 a 1.32 3.78 1.6 6 5.85
## 8 N2 2 2020 a 1.28 4.32 1.4 6.1 6.48
## 9 N2 3 2020 a 1.35 3.95 1.3 6.2 7.21
## 10 N2 1 2020 b 1.33 3.47 2.8 4.1 6.56
## # … with 14 more rows
tidyverse
在tidyverse中可以通过以下方法去实现。
1、select函数
利用select将要排序的列选择出来后排序。
df %>% select(nitrogen, variety, v3) # 通过select函数将要排序的列按排序要求选择出来。
## # A tibble: 24 × 3
## nitrogen variety v3
## <chr> <chr> <dbl>
## 1 N1 a 0.4
## 2 N1 a 0.1
## 3 N1 a 0.3
## 4 N1 b 1.8
## 5 N1 b 1.7
## 6 N1 b 1.5
## 7 N2 a 1.6
## 8 N2 a 1.4
## 9 N2 a 1.3
## 10 N2 b 2.8
## # … with 14 more rows
df %>% select(nitrogen, block, everything()) # 把nitrogen和block调整到第1和第2列。
## # A tibble: 24 × 9
## nitrogen block year variety v1 v2 v3 v4 v5
## <chr> <dbl> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 N1 1 2020 a 1.26 2.14 0.4 5 3.25
## 2 N1 2 2020 a 1.2 2.9 0.1 5.3 1.27
## 3 N1 3 2020 a 1.3 3 0.3 5.6 2.24
## 4 N1 1 2020 b 1.08 1.72 1.8 2.8 1
## 5 N1 2 2020 b 1.05 1.65 1.7 2.5 3.12
## 6 N1 3 2020 b 1.15 1.35 1.5 3.1 4.57
## 7 N2 1 2020 a 1.32 3.78 1.6 6 5.85
## 8 N2 2 2020 a 1.28 4.32 1.4 6.1 6.48
## 9 N2 3 2020 a 1.35 3.95 1.3 6.2 7.21
## 10 N2 1 2020 b 1.33 3.47 2.8 4.1 6.56
## # … with 14 more rows
2、relocate函数
relocate可以将选择的列放置在指定列的前后。
relocate(.data, ..., .before, .after)
.data:要处理的数据框;
...:选择的要移动的列。
.before和.after:指定放置在之前或之后的列。
df %>% relocate(nitrogen, block) # 只排序指定的列,其他列在指定列后,顺序不变。
## # A tibble: 24 × 9
## nitrogen block year variety v1 v2 v3 v4 v5
## <chr> <dbl> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 N1 1 2020 a 1.26 2.14 0.4 5 3.25
## 2 N1 2 2020 a 1.2 2.9 0.1 5.3 1.27
## 3 N1 3 2020 a 1.3 3 0.3 5.6 2.24
## 4 N1 1 2020 b 1.08 1.72 1.8 2.8 1
## 5 N1 2 2020 b 1.05 1.65 1.7 2.5 3.12
## 6 N1 3 2020 b 1.15 1.35 1.5 3.1 4.57
## 7 N2 1 2020 a 1.32 3.78 1.6 6 5.85
## 8 N2 2 2020 a 1.28 4.32 1.4 6.1 6.48
## 9 N2 3 2020 a 1.35 3.95 1.3 6.2 7.21
## 10 N2 1 2020 b 1.33 3.47 2.8 4.1 6.56
## # … with 14 more rows
df %>% relocate(nitrogen, .after = v2) # 将选择的列放置在指定位置。
## # A tibble: 24 × 9
## year variety block v1 v2 nitrogen v3 v4 v5
## <dbl> <chr> <dbl> <dbl> <dbl> <chr> <dbl> <dbl> <dbl>
## 1 2020 a 1 1.26 2.14 N1 0.4 5 3.25
## 2 2020 a 2 1.2 2.9 N1 0.1 5.3 1.27
## 3 2020 a 3 1.3 3 N1 0.3 5.6 2.24
## 4 2020 b 1 1.08 1.72 N1 1.8 2.8 1
## 5 2020 b 2 1.05 1.65 N1 1.7 2.5 3.12
## 6 2020 b 3 1.15 1.35 N1 1.5 3.1 4.57
## 7 2020 a 1 1.32 3.78 N2 1.6 6 5.85
## 8 2020 a 2 1.28 4.32 N2 1.4 6.1 6.48
## 9 2020 a 3 1.35 3.95 N2 1.3 6.2 7.21
## 10 2020 b 1 1.33 3.47 N2 2.8 4.1 6.56
## # … with 14 more rows
df %>% relocate(nitrogen, .after = v1) %>% relocate(block, .before = v3) # 重复使用relocate进行多列的移动。
## # A tibble: 24 × 9
## year variety v1 nitrogen v2 block v3 v4 v5
## <dbl> <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 2020 a 1.26 N1 2.14 1 0.4 5 3.25
## 2 2020 a 1.2 N1 2.9 2 0.1 5.3 1.27
## 3 2020 a 1.3 N1 3 3 0.3 5.6 2.24
## 4 2020 b 1.08 N1 1.72 1 1.8 2.8 1
## 5 2020 b 1.05 N1 1.65 2 1.7 2.5 3.12
## 6 2020 b 1.15 N1 1.35 3 1.5 3.1 4.57
## 7 2020 a 1.32 N2 3.78 1 1.6 6 5.85
## 8 2020 a 1.28 N2 4.32 2 1.4 6.1 6.48
## 9 2020 a 1.35 N2 3.95 3 1.3 6.2 7.21
## 10 2020 b 1.33 N2 3.47 1 2.8 4.1 6.56
## # … with 14 more rows
6.1.4 列更名
Base R
可通过索引找到需改名的列,通过赋值改变列名。如colnames(df)[1] = "Y"表示将df数据集第1列列名year改为Y。
colnames(df) # 获取列名称。
names(df) # 同上,获取列名。
## [1] "year" "nitrogen" "variety" "block" "v1" "v2" "v3"
## [8] "v4" "v5"
tidyverse
set_names() :修改列名。 rename():部分修改列名,函数内部写新名=旧名。
select():在进行列选择的时候可以给选择的列指定新的名称。
relocate():实际上是将选定的列移动到第1列,移动的同时给列名重新进行了命名。
set_names(df, LETTERS[1:9]) # 对df所有列进行了重命名,命名为大写字母A到I。
## # A tibble: 24 × 9
## A B C D E F G H I
## <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
df %>% rename(B = block, N = nitrogen, 变量1 = v1) # rename函数可对部分列名进行修改,新名=旧名。
## # A tibble: 24 × 9
## year N variety B 变量1 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
df %>% select_all(toupper) # 将列名全部变为大写字母。小写可以录入参数tolower。
## # 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
df %>% select(A = nitrogen, B = v1) # select选择列的同时对列名进行重命名。
## # A tibble: 24 × 2
## A B
## <chr> <dbl>
## 1 N1 1.26
## 2 N1 1.2
## 3 N1 1.3
## 4 N1 1.08
## 5 N1 1.05
## 6 N1 1.15
## 7 N2 1.32
## 8 N2 1.28
## 9 N2 1.35
## 10 N2 1.33
## # … with 14 more rows
df %>% select(B = block, N = nitrogen, everything()) # 可以通过select函数将要更名的列指定新名,再配合everything选择所有列实现更名。
## # A tibble: 24 × 9
## B N year variety v1 v2 v3 v4 v5
## <dbl> <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 1 N1 2020 a 1.26 2.14 0.4 5 3.25
## 2 2 N1 2020 a 1.2 2.9 0.1 5.3 1.27
## 3 3 N1 2020 a 1.3 3 0.3 5.6 2.24
## 4 1 N1 2020 b 1.08 1.72 1.8 2.8 1
## 5 2 N1 2020 b 1.05 1.65 1.7 2.5 3.12
## 6 3 N1 2020 b 1.15 1.35 1.5 3.1 4.57
## 7 1 N2 2020 a 1.32 3.78 1.6 6 5.85
## 8 2 N2 2020 a 1.28 4.32 1.4 6.1 6.48
## 9 3 N2 2020 a 1.35 3.95 1.3 6.2 7.21
## 10 1 N2 2020 b 1.33 3.47 2.8 4.1 6.56
## # … with 14 more rows
df %>% relocate(N = nitrogen) # relocate函数也可以进行列更名。
## # A tibble: 24 × 9
## N year variety block v1 v2 v3 v4 v5
## <chr> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 N1 2020 a 1 1.26 2.14 0.4 5 3.25
## 2 N1 2020 a 2 1.2 2.9 0.1 5.3 1.27
## 3 N1 2020 a 3 1.3 3 0.3 5.6 2.24
## 4 N1 2020 b 1 1.08 1.72 1.8 2.8 1
## 5 N1 2020 b 2 1.05 1.65 1.7 2.5 3.12
## 6 N1 2020 b 3 1.15 1.35 1.5 3.1 4.57
## 7 N2 2020 a 1 1.32 3.78 1.6 6 5.85
## 8 N2 2020 a 2 1.28 4.32 1.4 6.1 6.48
## 9 N2 2020 a 3 1.35 3.95 1.3 6.2 7.21
## 10 N2 2020 b 1 1.33 3.47 2.8 4.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