identifique segmentos superpuestos consecutivamente en R

Necesito agregar segmentos superpuestos en un solo segmento que varíatodos los segmentos conectados.

Tenga en cuenta que un simple foverlaps no puede detectar conexiones entre segmentos no superpuestos pero conectados, consulte el ejemplo para obtener una aclaración. Si lloviera en mis segmentos en mi parcela, estoy buscando los tramos de tierra seca.

Hasta ahora, resuelvo este problema mediante un algoritmo iterativo, pero me pregunto si hay un camino más elegante y directo para este problema. Estoy seguro de que no soy el primero en enfrentarlo.

staba pensando en una unión rodante no equitativa, pero no pude implementar esa

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

Eso es genial, gracias, cummax y cumsum hacen el trabajo, la respuesta de Uwe es ligeramente mejor que el comentario de Davids.

end[.N] puede obtener resultados incorrectos, pruebe con datos de ejemplox a continuación. @max(end) es correcto en todos los casos y más rápido.

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

min(start) ystart[1L] dar lo mismo (comox está ordenado por inicio), este último es más rápido.grp sobre la marcha es significativamente más rápido, desafortunadamente necesito grp asignado.cumsum(cummax(shift(end, fill = 0)) < start) es significativamente más rápido quecumsum(c(0, start[-1L] > cummax(head(end, -1L)))).No probé el paquete GenomicRanges solución.

Respuestas a la pregunta(2)

Su respuesta a la pregunta