如何用R的dplyr高效过滤掉同时满足多列条件的数据?
问题
我有一个数据集,希望过滤掉最喜欢的颜色为green且最喜欢的食物为sushi的记录;若仅满足其中一个条件,则保留该记录。我目前通过生成组合列的方式实现了需求,但想找更简洁的方法。
现有数据集:
library(dplyr) test <- tibble(person = c("Justin", "Corey", "Kate", "Sibley"), fav_food = c("sushi", "sushi", "cake", "tomatos"), fav_color = c("green", "red", "green", "blue"))
期望得到的数据集:
library(dplyr) answer <- tibble(person = c("Corey", "Kate", "Sibley"), fav_food = c("sushi", "cake", "tomatos"), fav_color = c("red", "green", "blue"))
我当前的实现代码:
library(dplyr) # code works but curious if there is a more straightforward approach test %>% mutate(food_color = paste(fav_food, fav_color, sep = "-")) %>% filter(food_color != "sushi-green")
简洁实现方法
不需要生成额外的组合列,直接在filter()中使用逻辑条件即可,更直观高效:
方法一:直接取反“同时满足两个条件”
test %>% filter(!(fav_food == "sushi" & fav_color == "green"))
方法二:用逻辑或的等价转换(De Morgan定律)
根据逻辑转换规则,!(A & B) 等价于 !A | !B,也可以写成:
test %>% filter(fav_food != "sushi" | fav_color != "green")
这两种写法都能直接过滤掉同时满足「fav_food为sushi且fav_color为green」的记录,保留其他所有行,和你当前代码的结果完全一致,但无需创建中间列,代码更简洁易读。
内容的提问来源于stack exchange,提问作者J.Sabree
相关产品推荐
相关产品推荐

