如何使用dplyr::filter_at结合多谓词表达式实现复合过滤?
合并两次filter_at的方法
其实你完全可以把两个条件合并到一次filter_at调用里,核心思路是在all_vars()里用逻辑与(&)把两个判断条件组合起来,这样就能同时满足「变量非缺失」和「变量等于1」的要求啦。
合并后的代码示例
假设你的tibble叫df,合并后的写法是:
library(dplyr) df %>% filter_at(vars(g1, g2), all_vars(!is.na(.) & . == 1))
补充:更推荐的现代写法
另外,filter_at属于dplyr里相对旧的语法,现在更推荐用across()函数来实现相同功能,代码可读性更强:
df %>% filter(across(c(g1, g2), ~ !is.na(.) & . == 1))
额外小提示
其实当你判断. == 1的时候,R会自动把NA值的行过滤掉(因为NA == 1的结果是NA,而filter()会默认移除结果为NA的行),所以如果你的场景里只要g1和g2都等于1就足够,甚至可以简化成:
df %>% filter(across(c(g1, g2), ~ . == 1))
这样就一次性完成了原来两次filter_at的工作,是不是更简洁?
内容的提问来源于stack exchange,提问作者semibruin
相关产品推荐
相关产品推荐

