R语言按连续索引合并data.frame连续行的实现方法
R实现线性区间按连续索引分组合并
核心思路:由于数据已经按index列升序排列,只需要先识别index的连续段生成分组标记,再按组做聚合即可。
方法1:dplyr 实现(代码简洁易读)
加载dplyr包后运行以下代码即可得到预期结果:
library(dplyr) merged.df <- df %>% # 生成分组标记:相邻index差不等于1时,新增一个组 mutate(group_id = cumsum(c(TRUE, diff(index) != 1))) %>% group_by(group_id) %>% summarise( id = paste(id, collapse = ";"), start = min(start), end = max(end), index = max(index), .groups = "drop" ) %>% select(-group_id)
运行后输出和示例预期完全一致:
# A tibble: 3 × 4 id start end index <chr> <dbl> <dbl> <dbl> 1 id1;id20 36 112 12 2 id7;id12 216 269 29 3 id15 300 340 33
方法2:base R 原生实现(无需安装第三方包)
不需要加载任何扩展包,用R自带函数即可完成:
# 生成连续段分组标记 df$group_id <- cumsum(c(TRUE, diff(df$index) != 1)) # 按组聚合计算 merged_list <- lapply(split(df, df$group_id), function(sub_df) { data.frame( id = paste(sub_df$id, collapse = ";"), start = min(sub_df$start), end = max(sub_df$end), index = max(sub_df$index) ) }) merged.df <- do.call(rbind, merged_list) rownames(merged.df) <- NULL
关键逻辑说明
- 分组标记生成逻辑:
diff(index)会计算每一行和上一行的index差值,差值为1代表两个index连续属于同组,差值大于1代表出现断层需要新建分组;cumsum累加断层的布尔标记,就能自动给每个连续段分配唯一的组id - 聚合阶段严格按照需求处理字段:
id字段用分号拼接,start取组内最小值,end取组内最大值,index取组内最大值
内容的提问来源于stack exchange,提问作者dan
相关产品推荐
相关产品推荐

