R语言如何将列表列名组合传入dplyr的filter()函数筛选行
解决方案
你只需要在?的位置填入all_of(name_combos[[i]])即可,all_of()是dplyr提供的标准选择辅助函数,专门用于将存储在字符向量/列表中的列名安全传入列选择上下文。
完整可运行代码
library(dplyr) # 构造示例数据 item1 <- c(-.5, 1.3, .8) item2 <- c(.9, 2.5, 1.2) item3 <- c(-1.2, .4, -2.1) df <- data.frame(item1,item2,item3) # 生成所有列名组合 name_combos <- lapply(1:3, function(x) combn(c("item1","item2","item3"), x, simplify = FALSE)) name_combos <- unlist(name_combos, recursive = FALSE) # 循环筛选 for (i in 1:length(name_combos)) { cat("当前筛选列组合:", paste(name_combos[[i]], collapse = ", "), "\n") results <- df %>% filter(if_all(all_of(name_combos[[i]]), ~ . > 0)) print(results) cat("------------------------\n") }
说明
name_combos[[i]]提取第i组列名字符向量all_of()将字符向量转为dplyr可识别的列选择参数,避免非标准求值带来的报错- 新增的
cat行仅用于输出当前处理的列组合,方便核对结果,不需要可以直接删除
补充说明:如果使用dplyr 1.0以下版本,可将
all_of替换为one_of,效果一致。
内容的提问来源于stack exchange,提问作者Jesse
相关产品推荐
相关产品推荐

