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

如何对齐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

关键步骤解释

  1. 事件ID分配:按wave分组后给每个事件分配唯一event_id,为后续配对识别提供标识。
  2. 避免重复配对:通过event_id.1 < event_id.2过滤自连接结果,确保每对事件只被检测一次,已配对的事件不会重复参与后续检测。
  3. 重叠判断:使用时间区间重叠的标准逻辑筛选有效重叠对,确保只保留真正有时间交集的事件。
  4. 宽表转换:通过两次pivot_wider将事件对的属性展开,让每一行清晰展示一对重叠事件的所有信息,符合目标结构要求。
  5. 列名整理:重命名列名,简化后缀,让输出结构更直观易读。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 17:53:17