如何使用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
相关产品推荐
相关产品推荐

