1
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 的行被丢弃在结果数据框中。我只能想到费力的解决方案。提前致谢。

结果表应如下所示:

结果

4

3 回答 3

0

让我们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
于 2021-08-27T20:11:51.077 回答
0

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

这就是为什么我想full_join可能会帮助你。

full_join 返回 x 和 y 的所有行和所有列。如果没有匹配的值,则为缺少的值返回 NA。

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

anti_join函数仅保留那些df1不与 中的行相交的行df2

于 2021-08-27T18:42:13.973 回答
0

这是您期望的奇怪结果,但我不知道您的计划是什么,因此这行代码将为您提供您想要的表格:

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

我刚刚添加了一个过滤器,以便只保留Ids 存在的 inf df1

于 2021-08-27T18:48:38.743 回答