如何基于两个DataFrame的匹配值创建第三个DataFrame?
解决方案
要生成符合预期的df3,核心逻辑是先筛选出df2中与df1满足「同一赛事(ID)、同一队伍(Team)、相同让分(Points)」条件的行,再将其与df1合并。以下是具体实现方式:
方法1:使用dplyr包(推荐)
library(dplyr) # 筛选df2中符合匹配条件的行 df2_filtered <- df2 %>% semi_join(df1, by = c("ID", "Team", "Points")) # 合并df1与筛选后的df2 df3 <- bind_rows(df1, df2_filtered)
方法2:基础R实现
# 提取df1中用于匹配的唯一键组合 match_keys <- unique(df1[c("ID", "Team", "Points")]) # 筛选df2中匹配的行 df2_filtered <- df2[ with(df2, paste(ID, Team, Points) %in% with(match_keys, paste(ID, Team, Points))), ] # 合并数据 df3 <- rbind(df1, df2_filtered)
结果说明
执行上述代码后,df3将包含df1的全部8行,加上df2中符合条件的4行(ID=1的前2行、ID=2的前2行),总计12行,与你预期的结构完全一致。
原方法失效原因
你之前使用的rows_upsert函数作用是更新匹配行并插入不匹配行,且指定的by参数包含了Home、Away、Price,这与实际需要的匹配条件(仅ID、Team、Points)不符,导致错误保留了df2中不满足条件的行,还覆盖了df1的部分数据。
内容的提问来源于stack exchange,提问作者Aaron Morris
相关产品推荐
相关产品推荐

