我问这个问题更多的是出于好奇,我可以使用filter()函数达到我想要的结果,但是我对下面的场景的解释感兴趣。
我想使用filter()通过!=运算符筛选出具有多个条件的值。我第一次尝试使用OR "|",但它没有正确地筛选出值。相反,它返回了所有数据,似乎没有筛选。但是,当我使用"&"时,它工作正常(见下文)。
前。
data %>%
filter(SampleTypeName != "Grab" &
SampleTypeName != "Composite" &
SampleTypeName != "Integrated" &
SampleTypeName != "Not Applicable")
当我想做相反的事情时,我过滤了等于上面相同字符串集的值。我直觉地认为使用"&"也是解决方案。相反,它返回了所有数据,看起来也是未经过滤的。结果,为了达到我想要的结果,我不得不使用"|"相反。
前。
data %>%
filter(SampleTypeName == "Grab" |
SampleTypeName == "Composite" |
SampleTypeName == "Integrated" |
SampleTypeName == "Not Applicable")
为什么会这样呢?我希望既能得到半深入的解释,又能得到像我五岁时那样的解释:)
谢谢
2条答案
按热度按时间bpzcxfmw1#
关于
dplyr::filter
首先要知道的是,多个表达式可以用逗号组合,这和使用“&"是一样的,例如:然而,正如@jon-spring的注解所指出的,测试多个字符串值的更好方法是使用
%in%
。在第二个例子中,你只需要去掉否定。
至于为什么“|“在第一个示例中未按预期工作:这是因为每一行都是根据每一个条件来计算的。假设你的变量
x
可以取“a”或“b”的值。现在问这个问题:“is x not equal to a OR is x not equal to B”。该问题的第一部分将保留x为“b”的行,该问题的第二部分将保留x为“a”的行。换句话说,如您所观察到的,所有行都将保留。sulc1iza2#
这不是
dplyr
的一个怪癖--这是DeMorgan's Law在命题逻辑中的一个应用,它陈述了¬A∧¬B ¬(A∨B)。用简单的英语来说,这个规则陈述了not A and not B = not(A or B)。用R术语来说,这意味着!(a & b) == !a | !b
,反之,!(a | b) == !a & !b
。查看this question,获得一个伟大的、容易理解的解释。在你的例子中,你把很多的否定和
&
结合起来,看起来像!A & !B & !C & !D
,根据德摩根定律,我们知道它等于!(A | B | C | D)
,为了得到它的否定,我们简单地去掉!
,所以我们剩下A | B | C | D
。