如何对齐DataFrame中重叠Wave事件并排除重复检测
对齐DataFrame中同Wave下的重叠时间事件
需求说明
我们需要处理包含时间区间的DataFrame,核心规则如下:
- 每个
wave分组下的事件由onset_min(起始时间)和end_min(结束时间)构成时间区间 - 识别同一
wave内存在时间重叠的事件对(一个事件的区间与另一个事件的区间有交集,即A的起始≤B的结束且A的结束≥B的起始) - 已完成配对的事件不再参与后续的重叠检测
- 最终将重叠事件对整理为宽表格式,每一行对应一对重叠事件
修正后的实现代码
首先加载依赖包并定义示例数据:
library(tidyverse) # 示例EAD数据 example_ead <- tibble( wave = c("EAD1", "EAD1", "EAD1", "EAD2", "EAD2", "EAD2"), onset_min = c(4.14, 4.16, 3.30, 5.04, 5.29, 5.11), end_min = c(4.21, 4.24, 3.35, 5.16, 5.37, 5.16), amplitude_mv = c(-4.72, -1.92, -4.16, -3.42, -2.96, -3.33) )
然后是处理函数,解决了原代码重复配对、未排除已处理事件的问题:
identify_and_reshape_events <- function(data) { data %>% # 按wave分组,给每个事件分配唯一ID group_by(wave) %>% mutate(event_id = row_number()) %>% ungroup() %>% # 自连接时只保留event_id.1 < event_id.2的配对,避免重复检测(A-B和B-A只保留一次) inner_join(., ., by = "wave", suffix = c(".1", ".2")) %>% filter(event_id.1 < event_id.2) %>% # 筛选存在时间重叠的事件对 filter(onset_min.1 <= end_min.2 & end_min.1 >= onset_min.2) %>% # 转换为宽表,按事件对展示所有属性 pivot_wider( id_cols = wave, names_from = event_id.1, values_from = c(onset_min.1, end_min.1, amplitude_mv.1), names_glue = "{.value}_event{event_id.1}" ) %>% pivot_wider( id_cols = wave, names_from = event_id.2, values_from = c(onset_min.2, end_min.2, amplitude_mv.2), names_glue = "{.value}_event{event_id.2}" ) %>% # 整理列顺序,让同一事件的属性集中展示 select( wave, matches("event1$"), matches("event2$") ) %>% # 简化列名,提升可读性 rename_with( ~str_replace(., "_event(\\d)$", "_\\1"), matches("_event\\d$") ) }
运行函数并查看结果:
overlapping_events <- identify_and_reshape_events(example_ead) print(overlapping_events)
输出结果:
# A tibble: 2 × 7 wave onset_min_1 end_min_1 amplitude_mv_1 onset_min_2 end_min_2 amplitude_mv_2 <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> 1 EAD1 4.14 4.21 -4.72 4.16 4.24 -1.92 2 EAD2 5.04 5.16 -3.42 5.11 5.16 -3.33
关键步骤解释
- 事件ID分配:按
wave分组后给每个事件分配唯一event_id,为后续配对识别提供标识。 - 避免重复配对:通过
event_id.1 < event_id.2过滤自连接结果,确保每对事件只被检测一次,已配对的事件不会重复参与后续检测。 - 重叠判断:使用时间区间重叠的标准逻辑筛选有效重叠对,确保只保留真正有时间交集的事件。
- 宽表转换:通过两次
pivot_wider将事件对的属性展开,让每一行清晰展示一对重叠事件的所有信息,符合目标结构要求。 - 列名整理:重命名列名,简化后缀,让输出结构更直观易读。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

