Это решает вопрос. Любить это

ужно объединить перекрывающиеся сегменты в одном диапазоневсе соединенные сегменты.

Обратите внимание, что простые переходы не могут обнаружить соединения между неперекрывающимися, но соединенными сегментами, см. Пример для пояснения. Если на моем участке будет дождь, я ищу участки сухой земли.

До сих пор я решал эту проблему с помощью итеративного алгоритма, но мне интересно, есть ли более элегантный и прямой путь для решения этой проблемы. Я уверен, что не первый, кто сталкивается с этим.

Я думал о неэквивалентном объединении, но не смог реализовать это

library(data.table)
(x <- data.table(start = c(41,43,43,47,47,48,51,52,54,55,57,59), 
                  end = c(42,44,45,53,48,50,52,55,57,56,58,60)))

#     start end
#  1:    41  42
#  2:    43  44
#  3:    43  45
#  4:    47  53
#  5:    47  48
#  6:    48  50
#  7:    51  52
#  8:    52  55
#  9:    54  57
# 10:    55  56
# 11:    57  58
# 12:    59  60

setorder(x, start)[, i := .I] # i is just a helper for plotting segments
plot(NA, xlim = range(x[,.(start,end)]), ylim = rev(range(x$i)))
do.call(segments, list(x$start, x$i, x$end, x$i))

x$grp <- c(1,3,3,2,2,2,2,2,2,2,2,4) # the grouping I am looking for
do.call(segments, list(x$start, x$i, x$end, x$i, col = x$grp))
(y <- x[, .(start = min(start), end = max(end)), k=grp])

#    grp start end
# 1:   1    41  42
# 2:   2    47  58
# 3:   3    43  45
# 4:   4    59  60

do.call(segments, list(y$start, 12.2, y$end, 12.2, col = 1:4, lwd = 3))

РЕДАКТИРОВАТЬ:

Это замечательно, спасибо, cummax и cumsum справляются со своей работой, Ответ Уве немного лучше, чем комментарий Дэвидса.

end[.N] можете получить неправильные результаты, попробуйте данные примераx ниже.max(end) правильно во всех случаях и быстрее.

x <- data.table(start = c(11866, 12696, 13813, 14011, 14041), end = c(13140, 14045, 14051, 14039, 14045))

min(start) а такжеstart[1L] дать то же самое (какx упорядочено по старту), последнее быстрее.GRP на лету значительно быстрее, к сожалению, мне нужно назначить GRP.cumsum(cummax(shift(end, fill = 0)) < start) значительно быстрее, чемcumsum(c(0, start[-1L] > cummax(head(end, -1L)))).Я не тестировал пакетGenomicRanges решение.

Ответы на вопрос(2)

Ваш ответ на вопрос