R中如何根据列内容保留包含0/1、1/1或1的行?
解决方案
核心匹配规则
首先定义全匹配正则,避免误匹配包含目标片段的其他取值:
match_pattern <- "^(0/1|1/1|1)$"
Base R 实现
方法1:逐行判断(适合中等规模数据)
逐行检查是否存在匹配值,任意单元格匹配则保留整行:
result <- df[apply(df, 1, function(row) any(grepl(match_pattern, row))), ]
方法2:向量化运算(性能更优,适合大表)
按列批量匹配后汇总行匹配结果,避免逐行遍历的性能损耗:
row_match_flag <- rowSums(sapply(df, function(col) grepl(match_pattern, col))) > 0 result <- df[row_match_flag, ]
data.table 实现
基于列迭代的逻辑运算,性能远高于行遍历,特别适配数千列的宽表场景:
library(data.table) setDT(df) # 将数据框转换为data.table格式 result <- df[df[, Reduce(`|`, lapply(.SD, function(x) grepl(match_pattern, x)))]]
原代码错误说明
你之前使用的dt[grepl("0/1", df),]存在两处核心问题:
grepl("0/1", df)会将整个数据框转为一维向量匹配,返回的结果长度等于总单元格数,和行索引长度不匹配,逻辑完全错误- 仅匹配了
0/1这一种目标值,未覆盖1/1和1,也没有加全匹配限制,容易出现误判
内容的提问来源于stack exchange,提问作者tacrolimus
相关产品推荐
相关产品推荐

