【问题标题】:R anti_join keep only rows from one dataframeR anti_join 只保留一个数据帧中的行
【发布时间】:2023-03-20 18:40:01
【问题描述】:
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 的行将被丢弃在结果数据框中。我只能想到费力的解决方案。提前致谢。

结果表应如下所示:

【问题讨论】:

  • 删除%&gt;% bind_rows(df2) 部分,否则我不明白这个问题。 anti_join(df1,df2, by = "Id") 将只提供df1 中不在df2 中的行。如果这不是您期望的结果,您能否改写问题或提供您的预期结果。
  • 如果您不想将 df2 绑定到您的数据上,为什么还要绑定它?
  • 我猜你真的想要这个结果:merge(df1, df2, all.x = T)
  • 这条线会给你你想要的:anti_join(df1,df2, by = "Id") %&gt;% bind_rows(df2) %&gt;% filter(Id %in% df1$Id)

标签: r anti-join


【解决方案1】:

这是你期望的一个奇怪的结果,但我不知道你的计划是什么,所以这行代码会给你准确的表格:

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

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

【讨论】:

    【解决方案2】:

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

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

    full_join 返回 x 和 y 的所有行和所有列。在哪里 没有匹配的值,为缺少的返回 NA。

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

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

    【讨论】:

    • “在您想要的输出中保留两个数据集的所有行和列”是不正确的。所需输出中没有 Id = 7 的行。
    【解决方案3】:

    让我们只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-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 2020-03-15
      • 2022-09-29
      相关资源
      最近更新 更多