本文总结R中利用tidyverse包中的函数来对数据进行规整。
1. tidy的数据
在R中数据需要是tidy的,即每个变量单独为一列,一行代表一次观察。
但是实际很多时候我们的数据并不是tidy的,比如,以下两个表格:
表1(宽表格):
name | rep1 | rep2 | rep3 |
---|---|---|---|
name1 | 1 | 2 | 3 |
name2 | 4 | 5 | 6 |
name3 | 7 | 8 | 9 |
表2(长表格):
name | exp | rep |
---|---|---|
name1 | 1 | rep1 |
name1 | 2 | rep2 |
name1 | 3 | rep3 |
name2 | 4 | rep1 |
name2 | 5 | rep2 |
name2 | 6 | rep3 |
name3 | 7 | rep1 |
name3 | 8 | rep2 |
name3 | 9 | rep3 |
在绘制ggplot2时,明显需要将表1(非tidy的)转化为表2(tidy的),但是每次手动转换很麻烦,所以tidyverse包提供了转换的函数,使用以下函数转换很方便:
pivot_longer()
能够将宽表格变成长表格。pivot_wider()
将长表格变成宽表格。
2. tidyr::pivot_longer()
参数:
- cols:哪些列需要转换
- name_to:用于分组的列,即选取的需要转换的列的列名,构成新的一列,新的这一列的名字
- values_to:选取的需要转换的列的值,构成新的一列,新的列的名字
1 | data <- data.frame( |
3. tidyr::pivot_wider()
将长表格变回宽表格,用pivot_wider()。
参数:
- names_from:转换之后列名所在的列的列名
- values_from:转换之后列中值所在的列名
1 | long_data %>% |
4. 列名转换成多个变量
当想要将原始的数据框的列名转换为多个变量时,怎么办?如下例,将A、B、C成为物种变量,其他的para1、para2、para3成为parameter变量:
1 | df <- data.frame( |
5. 复杂的情形
希望原始数据框的列名中,一部分进入变量,一部分保持原来的列名,比如,从表1到表2:
表1:
name | A_para1 | A_para2 | A_para3 | B_para1 | B_para2 | B_para3 |
---|---|---|---|---|---|---|
name1 | 1 | 2 | 3 | 4 | 5 | 6 |
name2 | 7 | 8 | 9 | 10 | 1 | 2 |
name3 | 3 | 4 | 5 | 6 | 7 | 8 |
表2:
name | rep | para1 | para2 | para3 |
---|---|---|---|---|
name1 | A | 1 | 2 | 3 |
name2 | A | 7 | 8 | 9 |
name3 | A | 3 | 4 | 5 |
name1 | B | 4 | 5 | 6 |
name2 | B | 10 | 1 | 2 |
name3 | B | 6 | 7 | 8 |
1 | df_part_longer <- df %>% |
反过来:
1 | df_part_longer %>% |
参考资料: