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

在R语言中按ID合并连续相同event值的行

问题描述

需要按id合并连续且具有相同event值的行,合并后取该连续块的第一个start值和最后一个end值。

原始数据

data.orig <- data.frame(
          id = c(1,1,1,1,1,1,1, 1),
          start = c(0, 47, 103, 194, 277, 350, 453, 522),
          end = c(47, 103, 194, 277, 350, 453, 522, 603),
          event = c(1, 0, 0, 1, 0, 0, 0, 0)
    )

目标数据

data.targ <- data.frame(
          id = c(1,1,1,1),
          start = c(0, 47, 194, 277),
          end = c(47, 194, 277, 603),
          event = c(1, 0, 1, 0)
    )

解决方案

核心是先创建连续相同event的分组标识,再基于这个标识进行聚合:

library(dplyr)

data.result <- data.orig %>%
  group_by(id) %>%
  # 创建分组标识:当前行event与前一行不同时,分组号+1
  mutate(group_id = cumsum(event != lag(event, default = first(event)))) %>%
  # 按id、分组标识、event聚合
  group_by(id, group_id, event) %>%
  summarize(
    start = first(start),
    end = last(end),
    .groups = "drop"
  ) %>%
  # 移除临时分组标识列
  select(-group_id)

# 查看结果
data.result

运行后输出结果与目标数据一致:

# A tibble: 4 × 4
     id event start   end
  <dbl> <dbl> <dbl> <dbl>
1     1     1     0    47
2     1     0    47   194
3     1     1   194   277
4     1     0   277   603

代码说明

  • lag(event, default = first(event)):获取当前行的前一行event值,第一行无前置行,用自身event值作为默认值。
  • cumsum(event != lag(...)):当当前行event与前一行不同时返回TRUE(即1),通过累加生成连续相同event的分组ID,确保连续相同event的行归为同一组。
  • summarize取first(start)和last(end),对应连续块的起始与结束时间。

内容的提问来源于stack exchange,提问作者Adrián Valls Carbó

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 07:12:49