我有一个数据框,我想在其中对齐恰好重叠的事件。例如:我有一个“波”,其中“开始”和“结束”之间有一个时间跨度,我想确定其他“波”是否在“开始”和“结束”之间的时间范围内开始或结束此“wave”id 的“。我也不希望在后续的对齐检查中考虑这些对齐波。
基本上,我希望最终得到一个看起来像这样的数据框:
谢谢您的指导!
# Example EAD data with different preparations
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)
)
# Function to identify and reshape overlapping depolarization events
identify_and_reshape_events <- function(data) {
data %>%
# Group by wave and create row numbers
group_by(wave) %>%
mutate(event_id = row_number()) %>%
ungroup() %>%
# Perform a self-join to identify overlapping events
left_join(data, by = "wave", suffix = c(".1", ".2")) %>%
filter(
# Filter for overlapping events based on onset_min and end_min
onset_min.1 <= end_min.2 & end_min.1 >= onset_min.2 &
event_id.1 != event_id.2 # Ensure different events within the same wave
) %>%
# Spread the data by wave
pivot_wider(
names_from = wave,
values_from = c(onset_min, end_min, amplitude_mv),
names_glue = "{.value}_{wave}"
) %>%
# Select columns in the desired order
select(
matches("^onset_min|^end_min|^amplitude_mv")
)
}
# Apply function to identify and reshape overlapping depolarization events
overlapping_events <- identify_and_reshape_events(example_ead)
这是使用 tidyverse 的方法,但我希望看到更优雅的解决方案。
example_ead |>
mutate(orig_row = row_number(), .before = 1) |>
arrange(wave, end_min) |>
mutate(align_grp = cumsum(onset_min > lag(end_min,1,T)),
.by = wave) |>
mutate(obs = row_number(), .by = c(wave, align_grp)) |>
arrange(orig_row) |>
select(-orig_row) |>
pivot_wider(names_from = obs,
values_from = c(onset_min:amplitude_mv), names_vary = "slowest")
使用示例数据的结果,与OP中的屏幕截图不同:
# A tibble: 4 × 8
wave align_grp onset_min_1 end_min_1 amplitude_mv_1 onset_min_2 end_min_2 amplitude_mv_2
<chr> <int> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 EAD1 2 4.14 4.21 -4.72 4.16 4.24 -1.92
2 EAD1 1 3.3 3.35 -4.16 NA NA NA
3 EAD2 1 5.04 5.16 -3.42 5.11 5.16 -3.33
4 EAD2 2 5.29 5.37 -2.96 NA NA NA