You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

代码解释

  1. across(ends_with("length"), ~ .x <= 13):针对所有以length结尾的列,生成一个逻辑矩阵(每个元素为TRUE表示该单元格≤13,FALSE表示>13)。
  2. rowSums(...):对每行的逻辑值求和(TRUE会被当作1,FALSE当作0),得到每行不满足条件的列数。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 16:56:15