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

dplyr::filter中多组if_all()联用不生效问题排查与解决

问题原因及解决方案

错误原因

你的代码里if_all(yes) == 1和if_all(no) == 0是错误的用法:

  • if_all()的默认行为是检查列值是否为逻辑真(数值型的1会被视为TRUE,0视为FALSE),直接写if_all(yes)等价于if_all(yes, ~ .x)。
  • 当你把if_all()的结果(逻辑向量)和数值1/0比较时,会自动把逻辑值转成数值(TRUE=1,FALSE=0),这就导致逻辑判断完全偏离预期:
    • 对于no列的条件if_all(no) ==0,只要no列不全为1(即不全是TRUE),这个判断就会返回TRUE——比如第3行的pub=1、sco=0,if_all(no)返回FALSE,转成数值0后等于0,所以条件成立,这就是为什么pub=1的行被错误保留了。

正确写法

你需要给if_all()传入明确的条件函数,指定列值等于1或0:

yes <- c("dim", "wos")  # 这些列的值应为1
no <- c("pub", "sco")   # 这些列的值应为0

df %>%
  dplyr::filter(if_all(yes, ~ .x == 1) & if_all(no, ~ .x == 0))

运行后会得到正确结果:仅保留第1、2行(移除了pub=1的第3、4行)。

也可以用dplyr::equals()让代码更简洁:

df %>%
  dplyr::filter(if_all(yes, equals(1)) & if_all(no, equals(0)))

内容的提问来源于stack exchange,提问作者anpami

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 08:18:24