在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ó
相关产品推荐
相关产品推荐

