使用pivot_wider转换数据时如何排除重复观测值?
解决方法:先去重再转宽表
要实现每个Name唯一且保留对应唯一ID的宽表格式,核心是先对每个Name下的ID去重,再进行宽表转换,步骤如下:
- 去重:按
Name和ID组合去重,确保每个Name下的ID只出现一次 - 编号:在每个
Name分组内,给唯一的ID按顺序编序号 - 转宽表:将编号后的
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
相关产品推荐
相关产品推荐

