如何在dplyr的filter函数中宽松使用if_all进行数据筛选?
解决宽松版的多列筛选需求
你遇到的问题是if_all会严格要求所有列都满足条件,而你需要的是更宽松的规则:要么所有列都大于13,要么只有1列不满足(≤13)。我们可以通过计数每行不满足条件的列数来实现这个需求,具体代码如下:
解决方案代码
library(dplyr) # 筛选:不满足(≤13)的列数 ≤1 的行 df %>% filter(rowSums(across(ends_with("length"), ~ .x <= 13)) <= 1)
运行后会得到符合要求的第3行:
A.length b.length C.length D.length E.length 3 11.884214 13.555158 14.053434 19.846216 13.381802
代码解释
across(ends_with("length"), ~ .x <= 13):针对所有以length结尾的列,生成一个逻辑矩阵(每个元素为TRUE表示该单元格≤13,FALSE表示>13)。rowSums(...):对每行的逻辑值求和(TRUE会被当作1,FALSE当作0),得到每行不满足条件的列数。filter(...) <=1:筛选出不满足条件的列数≤1的行,正好匹配你需要的两种情况:- 不满足列数=0:所有列都>13
- 不满足列数=1:仅1列≤13
等价写法(计算满足条件的列数)
你也可以反过来计算每行满足>13的列数,只要这个数量≥总列数-1(也就是≥4,因为你的数据有5列):
df %>% filter(rowSums(across(ends_with("length"), ~ .x > 13)) >= 4)
这个写法和上面的结果完全一致,选哪种都可以,看你更习惯哪种逻辑表述。
内容的提问来源于stack exchange,提问作者ghs101
相关产品推荐
相关产品推荐

