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

使用pivot_wider转换数据时如何排除重复观测值?

解决方法:先去重再转宽表

要实现每个Name唯一且保留对应唯一ID的宽表格式,核心是先对每个Name下的ID去重,再进行宽表转换,步骤如下:

  1. 去重:按Name和ID组合去重,确保每个Name下的ID只出现一次
  2. 编号:在每个Name分组内,给唯一的ID按顺序编序号
  3. 转宽表:将编号后的ID转换为宽表,缺失位置填充0

完整代码

library(tidyverse)

# 原始数据
df_have <- data.frame(
  Name = c("Maya", "Maya", "Maya", "Sierra", "Sophia", "Sophia", "Sophia", 
           "Sophia", "Cecilia", "Cecilia"),
  ID = c(24, 56, 24, 54, 12, 12, 15, 24, 12, 11)
)

# 处理流程
df_result <- df_have %>%
  # 保留每个Name下的唯一ID,移除重复行
  distinct(Name, ID, .keep_all = TRUE) %>%
  # 给每个Name分组内的唯一ID分配序号
  mutate(idno = row_number(), .by = Name) %>%
  # 转换为宽表,缺失值填充0
  pivot_wider(
    values_from = ID,
    names_from = idno,
    values_fill = 0,
    names_prefix = "ID"
  )

# 输出结果
print(df_result)

代码说明

  • distinct(Name, ID, .keep_all = TRUE):这一步是关键,它会保留每个(Name, ID)组合的唯一行,直接移除重复的ID条目,解决了你之前代码中保留重复值的问题。
  • mutate(idno = row_number(), .by = Name):仅对每个Name下的唯一ID编序号,避免了重复ID占用序号位置。
  • pivot_wider:按照编号将ID转为列,缺失的列用0填充,最终得到你需要的格式。

输出结果

运行代码后得到的结果与你期望的df_want完全一致:

Name ID1 ID2 ID3
1    Maya  24  56   0
2  Sierra  54   0   0
3  Sophia  12  15  24
4 Cecilia  12  11   0

内容的提问来源于stack exchange,提问作者maya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 18:45:04