如何在pivot_wider中拆分names_from列重复值为多列?
解决pivot_wider重复列名生成带序号列的问题
要实现将同一id下重复的priority对应的diagnosis拆分为primary_1、primary_2这类独立列,只需先给每个id+priority的分组添加序号,再结合序号生成新的列名即可,具体步骤如下:
步骤1:加载所需包
确保已安装并加载dplyr和tidyr:
library(dplyr) library(tidyr)
步骤2:添加分组序号
对数据按id和priority分组,给每组内的行添加递增序号:
data_with_seq <- data %>% group_by(id, priority) %>% mutate(seq = row_number()) %>% ungroup()
处理后的数据会新增seq列,id为2的两条primary记录会分别标记为1和2:
| id | priority | diagnosis | seq |
|---|---|---|---|
| 1 | primary | depression | 1 |
| 1 | secondary | anxiety | 1 |
| 1 | tertiary | anorexia | 1 |
| 2 | primary | depression | 1 |
| 2 | primary | anxiety | 2 |
| 2 | secondary | ptsd | 1 |
步骤3:透视生成带序号的列
将priority和seq拼接成新的列名,再执行pivot_wider:
data_pivoted <- data_with_seq %>% pivot_wider( id_cols = id, names_from = c(priority, seq), values_from = diagnosis )
最终得到的结果会把重复priority的诊断拆分到独立列:
| id | primary_1 | secondary_1 | tertiary_1 | primary_2 |
|---|---|---|---|---|
| 1 | depression | anxiety | anorexia | NA |
| 2 | depression | ptsd | NA | anxiety |
针对大型数据集的注意事项
由于你的数据集有200万行,建议:
- 尽量在管道操作中完成所有步骤,避免中间数据对象占用过多内存
- 若使用较新版本的
tidyr,pivot_wider的效率已做优化,无需额外调整 - 若内存紧张,可考虑使用
data.table包的dcast函数,处理大数据集的速度更快
内容的提问来源于stack exchange,提问作者Steven
相关产品推荐
相关产品推荐

