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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 23:57:18