如何使用apply或purrr对多列批量执行相同筛选规则?
R多列同条件筛选的高效实现
方案1:dplyr原生if_all()(优先推荐,tidyverse体系最优解)
dplyr 1.0.0及以上版本提供了多列条件判断的专用语法,无需额外封装函数或写循环,完全匹配你的需求:
library(dplyr) # 写法1:匹配所有以Q2_开头的列 data %>% filter(if_all(starts_with("Q2_"), ~ .x == 5)) # 写法2:精准匹配Q2_1到Q2_10,避免其他同前缀列被误选 data %>% filter(if_all(num_range("Q2_", 1:10), ~ .x == 5))
if_all会对选中的所有列执行判断,只有所有列都满足条件的行才会被保留,和你原来链式调用filter的逻辑完全一致,可读性和执行效率都更高。
如果使用的是1.0.0以下的旧版dplyr,可以用已废弃的filter_at实现相同效果:
data %>% filter_at(vars(num_range("Q2_", 1:10)), all_vars(. == 5))
方案2:purrr包循环实现
如果需要使用purrr体系的循环逻辑,可以通过reduce叠加筛选条件:
library(dplyr) library(purrr) target_cols <- paste0("Q2_", 1:10) data %>% reduce(target_cols, ~ filter(.x, !!.y == 5), .init = .)
方案3:base R apply系列实现
不依赖tidyverse的话,可以用apply逐行判断:
target_cols <- paste0("Q2_", 1:10) # 1表示按行遍历,判断每行所有值都等于5 row_mask <- apply(data[, target_cols], 1, function(x) all(x == 5)) result <- data[row_mask, ]
内容的提问来源于stack exchange,提问作者writer_typer
相关产品推荐
相关产品推荐

