原SAS用户求助:R语言tidyverse的filter多条件过滤问题
解决多条件删除数据的逻辑问题
Hey Wythe, 我完全懂你现在的困惑——你本来想删掉mtcars里同时满足8缸(cyl=8)且qsec≥18的2条观测,结果用filter(cyl != 8, qsec < 18)或者filter(qsec < 18 & cyl != 8)之后,只得到了5条数据,这和预期的30条差太远了对吧?
问题出在逻辑判断上
你当前的写法是在筛选同时满足「非8缸」和「qsec<18」的观测,这相当于把所有8缸车和所有qsec≥18的车都删掉了,范围比你想要的大得多。而你真正需要的是排除「同时是8缸且qsec≥18」的观测,对应的逻辑应该是「不满足(cyl=8 且 qsec≥18)」。
两种正确的写法
根据逻辑运算的德摩根定律,「NOT (A AND B)」等价于「NOT A OR NOT B」,所以你可以用以下两种方式实现需求:
方式1:直接否定目标条件
用括号把你要排除的条件包起来,前面加!表示否定:
filterdata <- mtcars %>% filter(!(cyl == 8 & qsec >= 18))
方式2:用OR拆分逻辑
把否定后的条件拆成「非8缸」或者「qsec<18」,只要满足其中一个就保留:
filterdata <- mtcars %>% filter(cyl != 8 | qsec < 18)
验证结果
这两种写法都会帮你保留除了Merc 450SLC和Cadillac Fleetwood之外的30条观测,完全符合你的预期。
内容的提问来源于stack exchange,提问作者wythe4
相关产品推荐
相关产品推荐

