在R中如何将含重复名称的数据框转宽,保留行输入不转列名
解决R中数据框按名称压缩多ID列的问题
要实现将重复Name对应的多个ID转为ID1、ID2等结构化列的需求,可以通过分组生成序号+宽表转换的方式实现,具体步骤如下:
步骤1:加载所需包
需要用到dplyr进行分组操作,tidyr进行宽表转换:
library(dplyr) library(tidyr)
步骤2:处理原始数据
先对每个Name分组,生成对应的ID序号(如1、2、3),再通过pivot_wider将ID按序号转为列,最后将缺失值替换为0:
df_have <- data.frame( Name = c("Maya", "Maya", "Sierra", "Sophia", "Sophia", "Sophia", "Cecilia", "Cecilia"), ID = c(24, 56, 54, 12, 15, 24, 12, 11) ) df_want <- df_have %>% group_by(Name) %>% mutate(id_num = paste0("ID", row_number())) %>% # 生成ID1、ID2...的列名标识 ungroup() %>% pivot_wider( names_from = id_num, values_from = ID, values_fill = 0 # 缺失位置填充0 ) df_want
运行结果与预期一致:
# A tibble: 4 × 4 Name ID1 ID2 ID3 <chr> <dbl> <dbl> <dbl> 1 Maya 24 56 0 2 Sierra 54 0 0 3 Sophia 12 15 24 4 Cecilia 12 11 0
为什么之前的pivot_wider用法不符合需求?
你之前直接使用pivot_wider时,默认将ID的具体值作为列名,这会导致每个ID编码都单独成列,不仅会让数据过度加宽,也无法实现按Name聚合ID的目标。通过先分组生成id_num(如ID1、ID2),再以此作为names_from的参数,就能实现按序号生成结构化的ID列,精准匹配需求。
内容的提问来源于stack exchange,提问作者maya
相关产品推荐
相关产品推荐

