如何使用dplyr的filter()函数可扩展地筛选数据框中至少含一个TRUE布尔值的行?
哈哈,手动写一堆|确实太不友好了,尤其是布尔变量多的时候,改起来要疯!给你两个用dplyr实现的扩展性拉满的方法:
方法1:利用rowSums+逻辑列筛选
因为逻辑值在R里本质是1(TRUE)和0(FALSE),所以我们可以先选中所有逻辑型的列,计算每行的和,只要和大于0就说明至少有一个TRUE:
library(tidyverse) data <- data.frame(w = c(1, 2, 3, 4), x = c(F, F, F, F), y = c(T, T, F, T), z = c(T, F, F, T), z1 = c(12, 4, 5, 15)) data %>% filter(rowSums(select(., where(is.logical))) > 0)
输出结果:
w x y z z1 1 1 FALSE TRUE TRUE 12 2 2 FALSE TRUE FALSE 4 3 4 FALSE TRUE TRUE 15
方法2:用dplyr的if_any函数(推荐,更直观)
从dplyr 1.0.0版本开始,新增了if_any和if_all函数,专门用来处理“任意列满足条件”或“所有列满足条件”的场景,完美适配你的需求:
# 完整写法 data %>% filter(if_any(where(is.logical), ~ .x == TRUE)) # 更简洁的写法:逻辑值本身就是布尔结果,直接判断即可 data %>% filter(if_any(where(is.logical)))
这两种写法都能得到预期结果,而且不管你后续加多少个布尔列,代码都不用修改,扩展性直接拉满!
如果你的需求是反过来(筛选所有布尔列都是FALSE的行),只需要把if_any换成if_all再做否定:
# 筛选所有布尔列均为FALSE的行(即示例中的第3行) data %>% filter(if_all(where(is.logical), ~ !.x))
内容的提问来源于stack exchange,提问作者user213544
相关产品推荐
相关产品推荐

