如何高效筛选满足多incl_*变量条件的DataFrame观测子集?
高效筛选特定前缀列全为1的DataFrame子集
方案1:dplyr 简洁实现(推荐)
从dplyr 1.0.0版本起,if_all()函数可以批量对指定列应用条件,完美解决你的需求:
library(dplyr) redcap <- df %>% filter(if_all(starts_with("incl"), ~ . == 1))
starts_with("incl")自动匹配所有以incl_开头的列~ . == 1定义对每一列的检查规则:值等于1if_all()确保所有匹配列都满足条件时,才保留该行
方案2:Base R 原生实现
不想加载额外包的话,用base R也能搞定:
# 提取所有以incl_开头的列名 incl_cols <- grep("^incl_", names(df), value = TRUE) # 筛选所有目标列都为1的行 redcap <- df[rowSums(df[, incl_cols] == 1) == length(incl_cols), ]
原理很简单:计算每行中值为1的目标列数量,当数量等于目标列总数时,说明该行所有目标列都满足条件。
你之前的代码为什么失效?
你尝试的filter(df, select(df, startswith("incl")) ==1)有个关键问题:select()返回的是一个子DataFrame,直接和1比较会生成一个布尔型的DataFrame,但filter()需要的是每行一个TRUE/FALSE的一维向量,所以无法正确筛选。而if_all()会自动把多列的布尔结果合并成每行的单一判断,刚好适配filter()的要求。
内容的提问来源于stack exchange,提问作者theflowingflo
相关产品推荐
相关产品推荐

