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
相关产品推荐
相关产品推荐

