R anti_join 只保留一个数据帧中的行

R anti_join keep only rows from one dataframe

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)

有没有一种简单的方法可以生成 anti_join 的结果,以便结果中只出现 df1 的行。因此,例如,Id 为 7 的行被丢弃在生成的数据框中。我只能想到费力的解决方案。提前致谢。

结果 table 应该如下所示:

在您想要的输出中,两个数据集中的所有行和列都被保留。

这就是为什么我想 full_join 可能会对您有所帮助。

full_join return all rows and all columns from both x and y. Where there are not matching values, returns NA for the one missing.

library(tidyverse)
new_df <- df1 %>% full_join(df2)

anti_join 函数仅保留 df1 中与 df2.

中的行不相交的那些行

这是你期望的奇怪结果,但我不知道你的计划是什么,所以这行代码会给你正是你想要的table:

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

我刚刚添加了一个过滤器,以便仅保留 Id 存在的信息 df1

我们只join:

library(dplyr)
x <- df1 %>% 
    anti_join(df2, by = "Id") 

y <- df2 %>%  
    semi_join(df1, by = "Id") 

x %>% 
    full_join(y, by="Id")
 Id Product Test   State
1  1 Toaster   NA    <NA>
2  3 Toaster   NA    <NA>
3  5   Radio   NA    <NA>
4  2    <NA>   NA Alabama
5  4    <NA>   NA Alabama
6  6    <NA>   NA    Ohio