在R中拆分重叠时间区间、设置优先级并填充间隙的方法
处理带优先级的重叠机器事件数据:无重叠区间转换、间隙填充与合并
问题背景
我在R中处理机器事件数据,每条事件包含:
- 开始时间、结束时间
- 唯一事件码
- 优先级(有序因子,级别越高优先级越高)
需要实现三个核心需求:
- 将重叠事件拆分为无重叠时间区间,每个区间继承该时段内优先级最高的事件属性
- 用虚拟事件(
event_code = 0,precedence = Level 0)填充事件之间的无事件间隙 - 合并具有相同事件码和优先级的连续区间,避免碎片化
可复现示例
输入数据(startstate)
startstate <- structure(list( event_code = c(101, 202, 303, 202, 404), start_time = structure(c(1735689600, 1735707600, 1735725600, 1735743600, 1735756200), class = c("POSIXct", "POSIXt"), tzone = "UTC"), end_time = structure(c(1735718400, 1735722000, 1735740000, 1735758000, 1735776000), class = c("POSIXct", "POSIXt"), tzone = "UTC"), precedence = structure(c(1L, 2L, 1L, 2L, 3L), levels = c("Level 1", "Level 2", "Level 3"), class = c("ordered", "factor")) ), class = "data.frame", row.names = c(NA, -5L)) # 查看输入 startstate
输出展示:
event_code start_time end_time precedence 1 101 2025-01-01 00:00:00 2025-01-01 08:00:00 Level 1 2 202 2025-01-01 05:00:00 2025-01-01 09:00:00 Level 2 3 303 2025-01-01 10:00:00 2025-01-01 14:00:00 Level 1 4 202 2025-01-01 15:00:00 2025-01-01 19:00:00 Level 2 5 404 2025-01-01 18:30:00 2025-01-02 00:00:00 Level 3
期望输出(endstate)
endstate <- structure(list( event_code = c(101, 202, 0, 303, 0, 202, 404), start_time = structure(c(1735689600, 1735707600, 1735722000, 1735725600, 1735740000, 1735743600, 1735756200), tzone = "UTC", class = c("POSIXct", "POSIXt")), end_time = structure(c(1735707600, 1735722000, 1735725600, 1735740000, 1735743600, 1735756200, 1735776000), tzone = "UTC", class = c("POSIXct", "POSIXt")), precedence = c("Level 1", "Level 2", "Level 0", "Level 1", "Level 0", "Level 2", "Level 3") ), row.names = c(NA, -7L), class = c("tbl_df", "tbl", "data.frame")) # 查看期望输出 endstate
输出展示:
event_code start_time end_time precedence 1 101 2025-01-01 00:00:00 2025-01-01 05:00:00 Level 1 2 202 2025-01-01 05:00:00 2025-01-01 09:00:00 Level 2 3 0 2025-01-01 09:00:00 2025-01-01 10:00:00 Level 0 4 303 2025-01-01 10:00:00 2025-01-01 14:00:00 Level 1 5 0 2025-01-01 14:00:00 2025-01-01 15:00:00 Level 0 6 202 2025-01-01 15:00:00 2025-01-01 18:30:00 Level 2 7 404 2025-01-01 18:30:00 2025-01-02 00:00:00 Level 3
编辑说明:修正了endstate中的event_code笔误,感谢@jon-spring指出。
当前尝试与遇到的问题
我尝试用ivs包处理重叠区间(因其支持右开区间),但遇到两个主要问题:
- 拆分后出现相同事件码和优先级的相邻行,需要手动合并(如下示例中后两行
202事件应合并)
event_code start_time end_time precedence 101 2025-01-01 00:00:00 2025-01-01 05:00:00 Level 1 202 2025-01-01 05:00:00 2025-01-01 08:00:00 Level 2 202 2025-01-01 08:00:00 2025-01-01 09:00:00 Level 2 <- 应与上一行合并
- 不清楚如何简洁地插入间隙填充行,实现无事件时段的虚拟事件填充
寻求解决方案
需要解决以下三个核心问题的实现方法:
- 将重叠区间拆分为无重叠区间,并正确分配最高优先级的事件属性
- 自动插入
Level 0虚拟事件填充事件间隙 - 自动合并相同属性的连续区间
内容的提问来源于stack exchange,提问作者Rahul Premraj
相关产品推荐
相关产品推荐

