如何使用dplyr包比较两个数据框并剔除出现在第二个“淘汰列表”数据框中的行?
解决方案:保留df1中ID未出现在df2的行
嘿,既然你是dplyr的忠实用户,那必须先给你安排最对味的dplyr方案,顺便也补个基础R的简单写法,按需选用~
dplyr 方案(推荐)
dplyr里的anti_join()简直是为这个需求量身定做的——它专门用来保留第一个数据框中,在第二个数据框里找不到匹配键的行,完美契合你把df2当“淘汰列表”的需求:
library(dplyr) # 先定义你的两个数据框 df1 <- data.frame( ID = c(1,2,3,4,5), Value = c(10,20,30,40,50) ) df2 <- data.frame( ID = c(6,7,8,1,2), Value = c(60,70,80,10,20) ) # 执行反连接,按ID匹配 df3 <- df1 %>% anti_join(df2, by = "ID") # 查看结果 df3
运行后你会得到正好想要的结果:
ID Value 1 3 30 2 4 40 3 5 50
原理很简单:anti_join()会对比两个数据框的ID列,只留下df1里那些ID没在df2中出现过的完整行,自动剔除掉ID为1和2的行。
基础R 方案
如果不想加载包,用基础R的%in%运算符也能快速实现,写法更简洁:
# 定义数据框 df1 <- data.frame( ID = c(1,2,3,4,5), Value = c(10,20,30,40,50) ) df2 <- data.frame( ID = c(6,7,8,1,2), Value = c(60,70,80,10,20) ) # 筛选ID不在df2中的行 df3 <- df1[!df1$ID %in% df2$ID, ] # 查看结果 df3
这里df1$ID %in% df2$ID会生成一个逻辑向量,标记df1的每个ID是否存在于df2中,加!取反后,就筛选出了不在淘汰列表里的行,结果和dplyr方案完全一致。
内容的提问来源于stack exchange,提问作者Curious Jorge - user9788072
相关产品推荐
相关产品推荐

