如何合并CSV文件并输出Cross Ref与Key不匹配的产品
解决CSV合并后提取不匹配项的问题
嘿,我明白你的需求了——你已经知道怎么合并匹配的数据,但现在要找出两个CSV里Cross Ref和Key不匹配的所有产品对吧?你之前用merge(..., all=T)没拿到想要的结果?其实all=T是会保留所有行的,只是你没做后续的筛选而已,我给你两种靠谱的解决方法:
方法1:基于全连接后筛选不匹配行
你之前的全连接代码其实已经把所有行(匹配+不匹配)都拉进来了,只是需要过滤掉那些两边都有数据的匹配行,留下至少一边有缺失的不匹配行:
# 先执行全连接,保留所有行 merged_full <- merge(file1, file2, by.x = "Cross.Ref", by.y = "Key", all = TRUE) # 筛选出不匹配的行:要么file1的信息缺失,要么file2的信息缺失 unmatched_products <- merged_full[is.na(merged_full$GROUP) | is.na(merged_full$Product), ]
这里的逻辑很直观:
is.na(merged_full$GROUP):表示file2里的某个Key在file1的Cross.Ref里找不到对应项is.na(merged_full$Product):表示file1里的某个Cross.Ref在file2的Key里找不到对应项
这两类都是你要的不匹配产品
方法2:用dplyr的anti_join(大数据量更高效)
如果你的CSV数据量特别大,全连接可能会占用过多内存,这时候用dplyr的anti_join会更高效,它直接返回左表中在右表找不到匹配的行,不用先合并所有数据:
library(dplyr) # 找出file1中Cross.Ref不在file2的Key里的产品 unmatched_from_file1 <- anti_join(file1, file2, by = c("Cross.Ref" = "Key")) # 找出file2中Key不在file1的Cross.Ref里的产品 unmatched_from_file2 <- anti_join(file2, file1, by = c("Key" = "Cross.Ref")) # 把两部分不匹配的数据合并成最终结果(如果需要统一输出的话) final_unmatched <- bind_rows(unmatched_from_file1, unmatched_from_file2)
这种方法的优势很明显:
- 内存占用更低,处理大文件速度更快
- 可以清晰区分哪些不匹配项来自哪个原始文件
你可以根据自己的需求选其中一种方法试试,应该就能得到你想要的所有不匹配产品啦~
内容的提问来源于stack exchange,提问作者c_174
相关产品推荐
相关产品推荐

