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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 11:42:44