R data frame按列名前缀索引批量筛选多x列均为1的行且保留全列的方法
实现方案
方案1:基础R(无需安装额外依赖包)
核心逻辑是先匹配所有前缀为x的列,再逐行判断这些列的取值是否全部为1:
# 匹配所有x前缀的列 x_col_idx <- startsWith(colnames(df), "x") # 逐行判断x列是否全为1,筛选符合条件的行,保留全部列 df_result <- df[apply(df[, x_col_idx], 1, function(r) all(r == 1)), ]
如果追求更高运行效率(尤其数据量较大时),可以用rowSums替代apply:
x_col_idx <- startsWith(colnames(df), "x") # 所有x列都为1时,每行等于1的个数刚好等于x列的总数量 df_result <- df[rowSums(df[, x_col_idx] == 1) == sum(x_col_idx), ]
方案2:tidyverse(写法简洁易读)
用dplyr的if_all语法可以一键完成多列条件匹配,代码适配性极强,哪怕后续x列增加到40个也无需修改逻辑:
library(dplyr) df_result <- df %>% # 对所有以x开头的列,要求取值全部等于1 filter(if_all(starts_with("x"), ~ .x == 1))
两种方案运行后都和手动逐列写条件得到的结果完全一致,且会保留z1等所有非x前缀的列。
内容的提问来源于stack exchange,提问作者mariodrumblue
相关产品推荐
相关产品推荐

