如何使用pivot_wider()生成一致的列名?
解决pivot_wider单列/多列展开列名统一问题
核心方案是利用pivot_wider()的names_glue参数,通过占位符自定义列名格式,实现不管展开单列还是多列,都生成「取值列名+names_from取值」的组合列名,且无需手动指定具体列名,适配任意处理列数。
代码示例
单列展开(统一列名格式)
library(tidyverse) df <- tibble( iso3c = c("DEU", "DEU", "FRA", "FRA"), period = c("pre", "post", "pre", "post"), var1 = 1:4, var2 = 5:8 ) # 单列展开,生成var1_pre/var1_post格式的列名 df |> pivot_wider( names_from = period, values_from = var1, names_glue = "{.value}_{.name}" ) #> # A tibble: 2 × 3 #> iso3c var1_pre var1_post #> <chr> <int> <int> #> 1 DEU 1 2 #> 2 FRA 3 4
多列展开(保持原有组合逻辑,格式统一)
# 多列展开,依然生成var1_pre/var1_post/var2_pre/var2_post格式 df |> pivot_wider( names_from = period, values_from = c(var1, var2), names_glue = "{.value}_{.name}" ) #> # A tibble: 2 × 5 #> iso3c var1_pre var1_post var2_pre var2_post #> <chr> <int> <int> <int> <int> #> 1 DEU 1 2 5 6 #> 2 FRA 3 4 7 8
原理说明
{.value}:自动对应values_from参数指定的列名(不管是单列还是多列){.name}:自动对应names_from参数列的取值(比如示例中的pre、post)- 这种方式无需手动设置列名或分隔符,完全适配任意数量的
values_from列,完美统一两种场景的列名格式。
内容的提问来源于stack exchange,提问作者dufei
相关产品推荐
相关产品推荐

