R语言嵌套分组下连续段顺序编号与组段长度统计实现
Markdown 排版规范
- 标题使用
#号标识层级 - 列表项以短横线
-开头 - 需要强调的文本使用星号
*包裹 - 代码或命令使用反引号
`包裹 - 引用类文本使用大于号
>开头 - 链接的标准格式为
[显示文本](目标URL) - 图片的标准格式为

适配需求的基础包实现方案
核心思路:用R基础包内置的rle(游程编码)识别每个sample分组内的连续同region片段,基于连续段生成顺序编号与段长度统计,全程无第三方包依赖。
实现逻辑
- 原尝试代码按
sample + region分组,会将同一sample下被其他值打断的同region记录合并为一组,导致编号无法在序列中断时重置 - 方案调整分组粒度为sample内部的连续同region段,通过游程编码自动识别连续同值段,为每个段生成唯一标识后,再计算段内序号和段长
完整可运行代码
# 读入原始测试数据集 df <- read.table(text = "sample time region a 10 S1 a 11 S1 a 12 S1 a 13 S3.2 a 14 S3.1 a 15 S3.2 a 16 S3.2 a 17 S3.1 a 18 S9.2 a 19 S9.2 a 20 S9.2 a 21 S9.2 a 22 S9.2 a 23 S3.2 a 24 S3.2 a 25 S3.2 a 26 S3.1 b 3 S9.2 b 4 S9.2 b 5 S9.2 b 6 S3.2 b 7 S3.2 b 8 S9.2", header = TRUE) # 步骤1:为每个sample内的连续同region段生成唯一标识 df$seg_id <- ave( df$region, df$sample, FUN = function(reg) { # 对当前sample的region序列做游程编码 rle_res <- rle(as.character(reg)) # 按各段长度重复段序号,得到逐行对应的段ID rep(seq_along(rle_res$lengths), times = rle_res$lengths) } ) # 步骤2:计算每个连续段内的顺序编号 df$seq <- ave( df$time, df$sample, df$seg_id, FUN = seq_along ) # 步骤3:统计每个连续段的总记录数 df$length <- ave( df$time, df$sample, df$seg_id, FUN = length ) # 可选:移除辅助计算列seg_id df$seg_id <- NULL
结果校验
运行代码后生成的数据集与给定的期望输出完全一致,可通过identical(df, result)做一致性验证。
内容的提问来源于stack exchange,提问作者Vesuccio
相关产品推荐
相关产品推荐

