【问题标题】:How I can select rows from a dataframe that do not match?如何从不匹配的数据框中选择行?
【发布时间】:2011-04-28 01:05:55
【问题描述】:

我正在尝试识别数据框中不匹配的值,但不知道如何执行此操作。

# make data frame 
a <- data.frame( x =  c(1,2,3,4)) 
b <- data.frame( y =  c(1,2,3,4,5,6))

# select only values from b that are not in 'a'
# attempt 1: 
results1 <- b$y[ !a$x ]

# attempt 2:  
results2 <- b[b$y != a$x,]

如果a = c(1,2,3) 有效,因为ab 的倍数。但是,我试图从数据框y 中选择所有不在x 中的值,并且不明白要使用什么函数。

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    如果我理解正确,您需要 %in% 运算符的否定。像这样的东西应该可以工作:

    subset(b, !(y %in% a$x))

    > subset(b, !(y %in% a$x))
      y
    5 5
    6 6
    

    【讨论】:

    • 感谢@Chase,我花了一些时间试图弄清楚%in% 运算符的否定是什么,但无法弄清楚。这个答案也很有帮助,因为它巧妙地对数据进行了子集化。
    • @celenius - %in% 运算符返回一个逻辑向量,告诉我们第一个运算符和第二个运算符之间是否匹配。 (b$y %in% a$x) [1] TRUE TRUE TRUE TRUE FALSE FALSE! 表示否定,因此将返回 !(b$y %in% a$x)[1] FALSE FALSE FALSE FALSE TRUE TRUE 。这有助于解释事情吗?
    • 迟到了,但是 Hmisc 现在有一个函数 %nin% 不在里面。非常有用
    【解决方案2】:

    尝试设置差异功能setdiff。所以你会有

    results1 = setdiff(a$x, b$y)   # elements in a$x NOT in b$y
    results2 = setdiff(b$y, a$x)   # elements in b$y NOT in a$x
    

    【讨论】:

      【解决方案3】:

      您也可以使用dplyr 来完成此任务。要查找 b 中的内容,但不是 a

      library(dplyr)    
      anti_join(b, a, by = c("y" = "x"))
      
      #   y
      # 1 5
      # 2 6
      

      【讨论】:

      • 这正是我一直在寻找的,以前从未见过,谢谢乔(与 dbplyr 一起工作,即在 SQL 远程上下文中)
      猜你喜欢
      • 2019-08-06
      • 1970-01-01
      • 1970-01-01
      • 2021-09-13
      • 2020-03-02
      • 2014-07-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多