有关何时使用“&”和“|“(OR)在dplyr::filter()函数中使用条件运算符“==”和“!=”时

aurhwmvo  于 2023-02-26  发布在  其他
关注(0)|答案(2)|浏览(164)

我问这个问题更多的是出于好奇,我可以使用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")

为什么会这样呢?我希望既能得到半深入的解释,又能得到像我五岁时那样的解释:)
谢谢

bpzcxfmw

bpzcxfmw1#

关于dplyr::filter首先要知道的是,多个表达式可以用逗号组合,这和使用“&"是一样的,例如:

data %>% 
  filter(SampleTypeName != "Grab", SampleTypeName != "Composite")

然而,正如@jon-spring的注解所指出的,测试多个字符串值的更好方法是使用%in%

data %>% 
  filter(!SampleTypeName %in% c("Grab", "Composite", "Integrated", "Not Applicable"))

在第二个例子中,你只需要去掉否定。

data %>% 
  filter(SampleTypeName %in% c("Grab", "Composite", "Integrated", "Not Applicable"))

至于为什么“|“在第一个示例中未按预期工作:这是因为每一行都是根据每一个条件来计算的。假设你的变量x可以取“a”或“b”的值。现在问这个问题:“is x not equal to a OR is x not equal to B”。该问题的第一部分将保留x为“b”的行,该问题的第二部分将保留x为“a”的行。换句话说,如您所观察到的,所有行都将保留。

sulc1iza

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

相关问题