identificar segmentos sobrepostos consecutivos em R

Preciso agregar segmentos sobrepostos em um único segmento que variatodos os segmentos conectados.

Observe que um simplesoverover não pode detectar conexões entre segmentos não sobrepostos, mas conectados, consulte o exemplo para esclarecimentos. Se chover em meus segmentos na minha trama, estou procurando os trechos de solo seco.

Até agora, resolvo esse problema por um algoritmo iterativo, mas estou me perguntando se existe um caminho mais elegante e direto para esse problema. Tenho certeza de que não o primeiro a enfrentar.

Eu estava pensando em uma junção sem equi, mas não consegui implementar essa

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))

EDITAR:

Isso é brilhante, obrigado, cummax e cumsum fazem o trabalho, a resposta de Uwe é um pouco melhor do que o comentário de Davids.

end[.N] pode obter resultados incorretos, tente dados de exemplox abaixo.max(end) está correto em todos os casos e mais rápido.

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

min(start) estart[1L] dê o mesmo (comox é ordenado pelo início), o último é mais rápido.O GRP em tempo real é significativamente mais rápido, infelizmente eu preciso do GRP atribuído.cumsum(cummax(shift(end, fill = 0)) < start) é significativamente mais rápido quecumsum(c(0, start[-1L] > cummax(head(end, -1L)))).Não testei o pacoteGenomicRanges solução.

questionAnswers(2)

yourAnswerToTheQuestion