如何对除id列外的整个数据框执行pivot_wider宽表转换?
R实现多列批量pivot_wider转换方法
结论
不需要使用循环,tidyr本身的函数组合即可实现需求,最优方案是先通过pivot_longer合并所有待展开的分类列,再执行pivot_wider转换。
实现逻辑
你的需求本质是将数据框中除id、value_col外的所有分类列的取值,统一作为新列名,用value_col的对应值填充,因此先把多个分类列转为统一的长格式键值对,再做宽转换即可。
代码示例
首先加载依赖包:
library(tidyr) library(dplyr)
核心转换代码,输出结果和你给出的new_df2完全一致:
new_df2 <- old_df2 %>% # 排除id、value_col列,其余所有列转为长格式 pivot_longer(cols = -c(id, value_col), names_to = "tmp_col", values_to = "tmp_val") %>% # 用tmp_val的取值作为新列名,value_col作为值填充,缺失值设为"NULL" pivot_wider(names_from = tmp_val, values_from = value_col, values_fill = "NULL")
如果你需要和你最初的代码逻辑保持一致,把值存为列表格式,调整参数即可:
new_df2 <- old_df2 %>% pivot_longer(cols = -c(id, value_col), names_to = "tmp_col", values_to = "tmp_val") %>% pivot_wider(names_from = tmp_val, values_from = value_col, values_fn = list, values_fill = list(NULL))
扩展性说明
如果后续需要排除更多不需要展开的列,只需要修改pivot_longer中cols参数的排除列表即可,其余逻辑不需要改动,适配性极强。
内容的提问来源于stack exchange,提问作者piper180
相关产品推荐
相关产品推荐

