You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 06:54:49