【问题标题】:identify unique values of 2 data frames in R识别 R 中 2 个数据帧的唯一值
【发布时间】:2020-11-29 17:39:09
【问题描述】:

我正在使用 2 个数据框。我想要一个输出出现在数据框 1 中但不出现在数据框 2 中的行的文件。这是示例数据:

df1:
id    visit
094-1   2
094-2   3
0813-1  11
0813-3  22

df2:
id    visit
094-1   2
094-2   3
0819-2  8

这就是我想要的:

df3:
id    visit
0819-2  8

我试过这个,但它不起作用。有人可以帮忙吗?

library(tidyverse)
df1 %in% df2 -> x
df2[!x,]-> df3

【问题讨论】:

  • 可能您正在寻找出现在数据框 2 中而不是数据框 1 中的那些。您的预期输出表明 df2 中存在而 df1 中不存在的行。正确吗?
  • anti_join(df2, df1)

标签: r dataframe tidyverse tr


【解决方案1】:

在 dplyr 中有一个函数 setdiff 用于此:

df1 = data.frame(id=c("094-1","094-2","0813-1","0813-3"),visit=c(2,3,11,22))
df2 = data.frame(id=c("094-1","094-2","0819-2"),visit=c(2,3,8))

dplyr::setdiff(df2,df1)
      id visit
1 0819-2     8

或者:

library(dplyr)
setdiff(df2,df1)

【讨论】:

    【解决方案2】:

    使用data.table

    library(data.table)
    fsetdiff(setDT(df2), setDT(df1))
    #      id visit
    #1: 0819-2     8
    

    【讨论】:

      【解决方案3】:

      base r 解决方案使用与您问题中包含的代码类似的方法。此解决方案使用 %in% 运算符,但在与 ! 运算符结合使用时将其反转。

      数据:

      df1 <- data.frame(
        id = c("094-1", "094-2", "0813-1", "0813-3"),
        visit = c(2,3,11,22)
      )
      
      df2 <- data.frame(
        id = c("094-1", "094-2", "0819-2"),
        visit = c(2,3, 8)
      )
      

      代码:

      df3 <- df2[!df2$id %in% df1$id,]
      

      输出:

      df3
      
      #>       id visit
      #> 3 0819-2     8
      

      reprex package (v0.3.0) 于 2020 年 11 月 29 日创建

      【讨论】:

        猜你喜欢
        • 2022-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-24
        • 1970-01-01
        • 2011-01-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多