R语言pivot_wider多列转宽时按原列名+行序号命名列的方法
解决方案
不需要手动为每个待拓宽字段提前构造列名,利用pivot_wider()的内置命名规则即可直接生成符合要求的规整列名,核心逻辑为:
- 按ID分组,为每个ID下的多条记录生成从1开始的连续序号
- 直接指定需要拓宽的字段,通过命名参数控制列名拼接规则,自动生成「原字段名+序号」格式的列名
实现代码
library(tidyverse) result <- eg_data %>% group_by(ID) %>% mutate(seq = row_number()) %>% ungroup() %>% pivot_wider( id_cols = c(ID, FName, LName), names_from = seq, values_from = c(Code, Date), names_glue = "{.value}{seq}" )
参数说明
id_cols:指定每个ID仅保留唯一值、不需要拓宽的标识列,手动指定可避免函数自动识别列时出现偏差names_from = seq:将分组生成的行序号作为新列名的序号来源values_from:传入所有需要拓宽的字段向量即可,后续新增待拓宽字段时直接在该向量中追加列名,无需额外编写列名构造逻辑names_glue = "{.value}{seq}":核心命名控制参数,.value会自动匹配values_from中的原字段名,直接拼接序号后即可得到Code1/Code2/Date1/Date2格式的列名,列的总数量会自动适配数据集中单个ID的最大重复次数,缺失值自动填充NA
兼容低版本tidyr的写法
如果使用的tidyr版本较低不支持names_glue参数,可将pivot_wider部分替换为如下写法,通过设置空分隔符实现相同命名效果:
pivot_wider( id_cols = c(ID, FName, LName), names_from = seq, values_from = c(Code, Date), names_sep = "" )
运行结果
针对提供的示例数据,运行上述代码得到的输出完全匹配期望格式,完整结果如下:
# A tibble: 4 × 9 ID FName LName Code1 Code2 Code3 Date1 Date2 Date3 <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> 1 1 John Smith ECV EDC EER 2022-04-23 2021-12-21 2020-01-25 2 2 Gina Jones ECV ECV NA 2022-05-18 2020-05-26 NA 3 3 Tom Anderson EER NA NA 2021-01-21 NA NA 4 4 Bobby Kennedy EDC EER NA 2020-05-14 2020-06-25 NA
内容的提问来源于stack exchange,提问作者Adam_S
相关产品推荐
相关产品推荐

