You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

dplyr::filter()中==/!=与&/|搭配使用的规则疑问

多值过滤/筛选的逻辑运算符原理解释

通俗解释

排除多值(用!=)为什么得用&

你要把「Grab」「Composite」「Integrated」「Not Applicable」这几个值全踢出去,意思是只有同时不沾这四个值的行才符合要求。要是用|(或),只要行里的值不是这四个里的某一个就留下——但任何一行的数值肯定至少不是这四个里的某一个(比如某行是「Grab」,那它肯定不是另外三个),结果就是所有行都能通过,等于白忙活。

选中多值(用==)为什么得用|

你要挑这四个值里的任意一个,意思是只要行里的值是这四个里的随便哪一个就留下。要是用&(且),要求一行的数值同时是这四个不同的值,这根本不可能,结果就是啥也选不到(你说的返回全部数据大概率是操作失误,比如误加了取反符号!)。

半深入解释

从逻辑运算的真值表和dplyr的向量运算特性来拆解:

  1. !=搭配&的逻辑
    dplyr的filter会对每一行的条件做逐元素判断,返回布尔值(TRUE/FALSE),只有返回TRUE的行才会被保留。
    对于多值排除,SampleTypeName != "Grab" & SampleTypeName != "Composite"的逻辑是:只有当某行的SampleTypeName既不是"Grab",也不是"Composite"时,整个表达式才返回TRUE。扩展到四个值时,只有所有!=条件都为TRUE,整体才为TRUE,也就是精准排除了所有指定值。
    如果换成|,只要其中一个!=条件为TRUE,整体就为TRUE。由于任何值不可能同时等于四个指定值,每一行至少有三个!=条件为TRUE,导致整体表达式恒为TRUE,所有行都被保留。

  2. ==搭配|的逻辑
    对于多值筛选,SampleTypeName == "Grab" | SampleTypeName == "Composite"的逻辑是:只要某行的SampleTypeName等于其中任意一个指定值,整体表达式就返回TRUE,符合筛选要求。
    如果换成&,要求某行的SampleTypeName同时等于两个(或四个)不同的值,这在逻辑上是矛盾的,所以整体表达式恒为FALSE,不会保留任何行。

额外建议:更简洁的写法

其实不用嵌套一堆逻辑运算符,用%in%可以更清晰地实现需求:

  • 排除多值:
data %>% 
  filter(!SampleTypeName %in% c("Grab", "Composite", "Integrated", "Not Applicable"))
  • 选中多值:
data %>% 
  filter(SampleTypeName %in% c("Grab", "Composite", "Integrated", "Not Applicable"))

这种写法不仅代码更短,还能避免逻辑运算符用错的问题。

内容的提问来源于stack exchange,提问作者nps-randy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 19:39:23