关于何时使用“&”和“|”的问题(或)在 dplyr::filter() 函数中使用条件运算符“==”和“!=”时

问题描述 投票:0回答:1

我问这个问题更多是出于好奇。我能够使用 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")

为什么会这样?我将不胜感激半深入的解释和像我五岁这样的解释:)

谢谢

r dplyr tidyverse operators
1个回答
0
投票

关于

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”的值。现在问这个问题:“是 x 不等于 a 还是 x 不等于 b”。该问题的第一部分将保留 x 为“b”的行,该问题的第二部分将保留 x 为“a”的行。换句话说,正如您观察到的那样,所有行都保留了下来。

© www.soinside.com 2019 - 2024. All rights reserved.