R语言筛选DataFrame中存在连续两列值均为1的行
R语言筛选存在至少两个连续1的行方案
核心实现代码
# 构造示例数据 df <- read.table(text = " 0m-10m 0m-15m 0m-20m 0m-25m X 1 0 1 1 Y 1 1 0 0 Z 0 1 0 1 ", header = T) # 方法1:相邻列逻辑与运算,适合超大数据集,运算效率高 cond <- rowSums(df[,-ncol(df)] & df[,-1]) > 0 result <- df[cond, ] # 方法2:基于rle的实现,扩展性更强,可方便调整连续长度要求 cond <- apply(df, 1, function(row) { rle_res <- rle(row) any(rle_res$lengths >= 2 & rle_res$values == 1) }) result <- df[cond, ]
逻辑说明
你之前使用的
rowSums >=2逻辑仅能判断该行1的总数量≥2,无法校验1是否连续,因此会误筛选出Z行这类1不连续的结果。
- 方法1原理:
df[,-ncol(df)]为去掉最后一列的数据集,df[,-1]为去掉第一列的数据集,两者按位做逻辑与运算后,得到的矩阵每个元素代表原数据对应列和右侧相邻列是否同时为1;对矩阵按行求和,只要和大于0就说明该行存在至少一组连续的1,性能远高于逐行遍历,适合大型DataFrame使用。 - 方法2原理:通过
rle()函数统计每行连续相同值的长度和对应值,直接判断是否存在值为1且长度≥2的连续段,后续如果需要调整为筛选连续3个及以上1的行,仅需修改rle_res$lengths >= 2中的数值即可。
输出的result即为符合要求的结果:
0m-10m 0m-15m 0m-20m 0m-25m X 1 0 1 1 Y 1 1 0 0
内容的提问来源于stack exchange,提问作者Kala Downey
相关产品推荐
相关产品推荐

