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

如何使用dplyr、purrr等工具对数据框逐行检查条件?

解决逐行判断多列是否全部等于指定值的问题

我明白你遇到的困扰了——原来的代码之所以全返回FALSE,核心问题在于all()是对整个选中的列集合做全局判断,而不是逐行检查每一行的对应列是否都满足条件。举个具体的例子:select(.,-x) ==1会生成一个2列3行的逻辑矩阵,all()会把这个矩阵里的所有元素打包判断,只有当所有元素都是TRUE时才返回TRUE,但你的数据里第三行的z是0,所以全局判断结果是FALSE,然后这个单一的FALSE被广播到所有行,导致new列全是FALSE。

下面给你两种适配实际场景(变量多、指定值可变)的解决方案:

方法1:用rowwise() + c_across()(兼容旧版dplyr)

先按行分组,再用c_across()选中目标列,最后逐行用all()完成判断:

library(dplyr)
test <- data.frame(x=c(0,1,1), y = c(1,1,1), z = c(1,1,0))

test %>%
  rowwise() %>%
  mutate(new = all(c_across(-x) == 1)) %>%  # c_across(-x)选中除x外的所有列
  ungroup()  # 记得取消行分组,避免后续操作受影响

运行结果:

# A tibble: 3 × 4
      x     y     z new  
  <dbl> <dbl> <dbl> <lgl>
1     0     1     1 TRUE 
2     1     1     1 TRUE 
3     1     1     0 FALSE

方法2:用if_all()(推荐,更高效简洁)

dplyr 1.0.0及以上版本提供了if_all()函数,专门用来逐行检查所有指定列是否满足条件,不需要手动分组:

test %>%
  mutate(new = if_all(-x, ~ .x == 1))  # ~ .x == 1 定义每列元素的判断逻辑

如果你的指定值不是1,比如要检查等于固定值2,或者动态匹配某列的值,只需要修改判断逻辑即可,比如:

# 检查除x外的列是否全等于2
test %>% mutate(new = if_all(-x, ~ .x == 2))

这两种方法都支持select()的语法指定目标列(比如starts_with("y")、contains("col")等),完全适配你变量较多的实际场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:30:24