R语言:解决按Athletes连接不等长tibble的多对多重复问题
解决方案
核心问题在于你的两个tibble都是长格式结构(每个运动员对应多条记录),直接按Athletes连接会触发多对多关系(同一运动员在两个表中均有多行),导致数据重复与警告。正确的做法是先合并数据集,再转换为宽格式实现按运动员聚合,同时填充缺失值。
修正代码
替换你代码中#### TRYING TO JOIN TIBBLES ----之后的部分,使用以下代码:
# 合并两个结构相同的tibble combined_data <- bind_rows(traitement_RPE, traitement_VOL) # 转换为宽格式:每个运动员一行,RPE和VOL作为列,缺失值填充NA bilan_wide <- combined_data |> pivot_wider( id_cols = Athletes, names_from = Type, values_from = Valeur, values_fill = list(Valeur = NA) # 若要直接填充0,将NA改为0即可 ) # 若需要将NA统一替换为0,执行以下步骤 bilan_wide <- bilan_wide |> mutate( RPE = replace_na(RPE, 0), VOL = replace_na(VOL, 0) ) # 查看最终结果 print(bilan_wide) # 导出结果(可选) # write.xlsx(bilan_wide, file = "Bilan_Athletes.xls")
关键说明
- 合并长格式数据:用
bind_rows()将两个结构一致的tibble合并,保留所有运动员的所有记录。 - 转宽格式聚合:
pivot_wider()按Athletes分组,将Type列的RPE和VOL转为列名,Valeur作为对应列的值,自动为仅存在于一个表中的运动员填充NA。 - 缺失值替换:通过
replace_na()将NA替换为0,满足你的需求。
为什么之前的方法无效
left_join()/full_join():仅按Athletes连接时,同一运动员在两个表中的多行记录会生成笛卡尔积(比如运动员A在RPE有3行、VOL有2行,连接后会生成6行),因此触发多对多警告,且Type列重复。merge():本质和left_join逻辑一致,同样会生成行级别的连接结果,而非你需要的按运动员聚合的列连接。
内容的提问来源于stack exchange,提问作者user22799748
相关产品推荐
相关产品推荐

