如何在R语言分组数据中识别含指定长度连续非零序列的组
识别包含指定长度连续非零序列的分组
问题描述
需要在分组数据中,筛选出包含指定长度连续非零数值序列的组。以给定的示例数据为例,目标是找到包含长度为5的连续非零序列的组,仅组b符合要求。
示例数据:
set.seed(123) df <- data.frame( id = seq(1:40), grp = sort(rep(letters[1:4], 10)), x = c( c(0, sample(1:10, 3), rep(0, 6)), c(0, 0, sample(1:10, 5), rep(0, 3)), c(rep(0, 6), sample(1:10, 4)), c(0, 0, sample(1:10, 3), 0, sample(1:10, 2), 0, 0)) )
原方法的局限:
使用cumsum的方法仅统计非零值的总数,无法区分是否连续,会误判如组d这类非零值总数够但不连续的组:
library(dplyr) df %>% group_by(grp) %>% mutate(cc = cumsum(x != 0)) %>% filter(cc == 5) %>% distinct(grp)
解决方案
使用rle()(运行长度编码)函数,统计每个分组内连续非零值的长度,直接判断是否存在符合要求的连续段:
library(dplyr) # 设置目标连续非零长度 target_length <- 5 # 筛选符合条件的分组 df %>% group_by(grp) %>% summarize(has_valid_sequence = any(with(rle(x != 0), lengths[values] >= target_length))) %>% filter(has_valid_sequence) %>% select(grp)
代码解释
rle(x != 0):对每个分组的x列,生成"是否非零"的运行长度编码,返回包含values(是否非零)和lengths(连续长度)的列表。lengths[values]:提取所有连续非零段的长度。any(...) >= target_length:判断当前分组是否存在长度达标连续非零段。- 最后筛选出符合条件的分组,仅返回
grp列。
运行上述代码后,输出结果仅包含组b,符合预期。
内容的提问来源于stack exchange,提问作者EJJ
相关产品推荐
相关产品推荐

