如何使用tidyverse提取df1中未出现在df2的id观测值
提取df1中未在df2出现的id(tidyverse实现)
测试数据构造
先复现你给出的测试数据:
library(tidyverse) # 构造示例数据 df1 <- tibble(id = c(1, 2, 3, 4)) df2 <- tibble(id = c(1, 4))
方法1:使用anti_join(推荐)
anti_join是dplyr中专门用于取「左表有但右表无」匹配记录的函数,是这类需求最直接的实现:
result <- df1 %>% anti_join(df2, by = "id")
运行后得到的result和你期望的输出完全一致:
# A tibble: 2 × 1 id <dbl> 1 2 2 3
方法2:使用%in%逻辑筛选
如果你的df2是单独的向量而非带列名的数据框,也可以直接用逻辑判断筛选:
# 若df2是数值向量df2 <- c(1,4),则写法为 filter(!id %in% df2) result <- df1 %>% filter(!id %in% df2$id)
注意事项
- 匹配前请确认两个数据集的
id列数据类型一致,数值型和字符型无法自动匹配 - 调用
anti_join时建议显式指定by参数,避免默认按所有同名列匹配导致结果不符合预期 - 如果需要按多个字段匹配是否存在,只需要在
by参数中传入多列名组成的向量即可,例如by = c("id", "group")
内容的提问来源于stack exchange,提问作者D. Fowler
相关产品推荐
相关产品推荐

