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

R使用anti_join合并数据时仅保留df1包含的ID对应行的实现方法

原来的代码中bind_rows(df2)会保留df2的所有行,包括df1中不存在的Id=7的记录,你可以通过以下两种简便方式实现需求,均基于dplyr的语法逻辑,改动量很小:

方法1:提前过滤df2再合并(适合大数据量场景)

核心是用semi_join先提取df2中与df1的Id匹配的行,再进行纵向合并,避免无效数据参与合并:

library(dplyr)
df1 = data.frame(Id = c(1:6), Product = c(rep("Toaster", 3), rep("Radio", 3)), Test = NA)
df2 = data.frame(Id = c(2, 4, 6, 7), State = c(rep("Alabama", 2), rep("Ohio", 2)))

df_sum <- anti_join(df1, df2, by = "Id") %>% 
  bind_rows(semi_join(df2, df1, by = "Id"))

方法2:合并后统一过滤(写法更直观)

在原有代码基础上仅加一行过滤逻辑,保留仅存在于df1中的Id:

library(dplyr)
df1 = data.frame(Id = c(1:6), Product = c(rep("Toaster", 3), rep("Radio", 3)), Test = NA)
df2 = data.frame(Id = c(2, 4, 6, 7), State = c(rep("Alabama", 2), rep("Ohio", 2)))

df_sum <- anti_join(df1, df2, by = "Id") %>% 
  bind_rows(df2) %>% 
  filter(Id %in% df1$Id)

输出效果

两种方法最终得到的结果一致,符合预期:
预期输出结果

内容的提问来源于stack exchange,提问作者BroNKo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 13:39:03