You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 09:57:19