如何比对两个dataframe的公共列,查找仅在单个表中存在的行
多列匹配查找DataFrame独有条目的实现方法
你提到的dplyr::anti_join本身就支持多列作为匹配条件,只需要在by参数中传入要匹配的列名构成的字符向量即可。
具体实现代码
方法1:dplyr包实现(推荐)
# 加载dplyr包 library(dplyr) # 按Company_name、Transaction_Code两列匹配,提取dataframe1独有的条目 res <- anti_join( x = dataframe1, y = dataframe2, by = c("Company_name", "Transaction_Code") )
运行以上代码后得到的res就是你需要的结果,示例中dataframe1的第8条BBB + 3535的条目会保留在结果中。
方法2:基础R实现(无需安装第三方包)
如果你不想加载额外的包,也可以用基础R的语法实现:
# 拼接两列内容作为唯一匹配标识,筛选出dataframe1独有的行 match_key1 <- paste(dataframe1$Company_name, dataframe1$Transaction_Code, sep = "_") match_key2 <- paste(dataframe2$Company_name, dataframe2$Transaction_Code, sep = "_") res <- dataframe1[!match_key1 %in% match_key2, ]
注意事项
- 匹配前请确认两个DataFrame的匹配列数据类型完全一致,比如
Transaction_Code如果一个是数值型、一个是字符型,会导致匹配失败,可通过str(dataframe1)、str(dataframe2)查看列类型。 - 示例中dataframe2的Sum列出现的
050如果是数值型会被自动识别为50,但因为你匹配的是前两列,所以不会影响匹配结果。
内容的提问来源于stack exchange,提问作者user000
相关产品推荐
相关产品推荐

