R语言合并含重复行的Dataframe时merge返回多余匹配行如何处理
问题原因
base R的
merge函数默认对匹配键采用笛卡尔积匹配规则:若df1中某键值有N条记录,df2中同一键值有M条记录,合并后会返回N*M条该键值的匹配结果。你的示例中df1有2条(100,200,300)、df2有1条该记录,所以合并后返回2条重复结果,属于merge的默认正常逻辑。
解决方案
根据使用场景可以选择两种实现方式:
场景1:所有匹配键在df2中均唯一(你的示例属于该场景)
此时不需要保留df1的重复行,直接对df1的匹配键去重后再合并即可:
# base R实现 merge(x = unique(df1), y = df2) # dplyr实现,逻辑更清晰 library(dplyr) df1 %>% distinct() %>% inner_join(df2, by = c("A", "B", "C"))
两种方法都会返回你预期的1行(100,200,300)结果。
场景2:df2中存在重复匹配键,需要按df2的出现次数匹配df1的行
如果df2中某键值出现K次,要求合并后也返回K条对应记录,匹配df1中对应键值的前K行,可以给两个数据框按匹配键新增组内行号,合并后再删除辅助列即可:
library(dplyr) # 给df1按匹配键分组加行号 df1_with_id <- df1 %>% group_by(A, B, C) %>% mutate(match_id = row_number()) %>% ungroup() # 给df2按匹配键分组加行号 df2_with_id <- df2 %>% group_by(A, B, C) %>% mutate(match_id = row_number()) %>% ungroup() # 合并后删除辅助行号列 result <- inner_join(df1_with_id, df2_with_id, by = c("A", "B", "C", "match_id")) %>% select(-match_id)
该方案可以适配复杂场景:比如df2中某键值出现2次,合并后也只会返回2条对应记录,不会多返回。
内容的提问来源于stack exchange,提问作者Meghanath L
相关产品推荐
相关产品推荐

