Вот метод, использующий filter
из dplyr
и rleid
из data.table
:
library(dplyr)
t %>%
group_by(ID = cumsum(reference)) %>%
filter(data.table::rleid(abs(start-lag(end, default = start[1])) <= 5) == 1 & ID != 0) %>%
bind_rows(t %>%
arrange(desc(row_number())) %>%
group_by(ID = cumsum(reference)) %>%
filter(data.table::rleid(abs(end-lag(start, default = end[1])) <= 5) == 1 & ID != 0)) %>%
ungroup() %>%
select(-ID) %>%
distinct() %>%
arrange(start)
Ввод:
name reference start end
1 a 0 2 8
2 b 1 10 18
3 c 0 20 26
4 d 0 30 38
5 e 0 45 50
6 f 1 70 75
7 g 0 80 100
8 h 0 110 115
9 i 0 117 120
Вывод:
# A tibble: 6 x 4
name reference start end
<fct> <dbl> <dbl> <dbl>
1 a 0 2 8
2 b 1 10 18
3 c 0 20 26
4 d 0 30 38
5 f 1 70 75
6 g 0 80 100
Данные:
t <- data.frame( name = c("a", "b", "c", "d", "e", "f", "g", "h", "i"),
reference = c(0,1,0,0,0,1,0,0,0),
start = c(2, 10, 20, 30, 45, 70, 80, 110, 117),
end = c(8, 18, 26, 38, 50, 75, 100, 115, 120))
Обратите внимание, что хотя h
и i
находятся на расстоянии 5они не были выбраны, потому что они не соединялись с reference
f
.