You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

代码解释

  1. rle(x != 0):对每个分组的x列,生成"是否非零"的运行长度编码,返回包含values(是否非零)和lengths(连续长度)的列表。
  2. lengths[values]:提取所有连续非零段的长度。
  3. any(...) >= target_length:判断当前分组是否存在长度达标连续非零段。
  4. 最后筛选出符合条件的分组,仅返回grp列。

运行上述代码后,输出结果仅包含组b,符合预期。

内容的提问来源于stack exchange,提问作者EJJ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 15:10:24