Supongamos que tenemos start = 3, final = 7, y que había marcado cada uno como un '1' en una recta numérica a partir de 1
starts: 0 0 1 0 0 0 0 0 0 ...
ends + 1: 0 0 0 0 0 0 0 1 0 ...
la suma acumulada de las aperturas menos la suma acumulada de los extremos, y la diferencia entre los dos, es
cumsum(starts): 0 0 1 1 1 1 1 1 1 ...
cumsum(ends + 1): 0 0 0 0 0 0 0 1 1 ...
diff: 0 0 1 1 1 1 1 0 0
y las ubicaciones de los de 1 en el diff son
which(diff > 0): 3 4 5 6 7
Uso tabular para permitir múltiples inicia/termina en el mismo lugar, y
range2 <- function(ranges)
{
max <- max(ranges)
starts <- tabulate(ranges[,1], max)
ends <- tabulate(ranges[,2] + 1L, max)
which(cumsum(starts) - cumsum(ends) > 0L)
}
Para la pregunta, esto da
> eg <- matrix(c(1, 3, 10, 5, 6, 13), 3)
> range2(eg)
[1] 1 2 3 4 5 6 10 11 12 13
Es bastante rápido, por ejemplo de Andrie
> system.time(runs <- range2(xx))
user system elapsed
0.108 0.000 0.111
(esto suena un poco como DNA seque nce análisis, para el cual GenomicRanges podría ser su amigo; usaría las funciones coverage
y slice
en lecturas, quizás ingrese con readGappedAlignments
).
Creo que el OP quiere que el resultado muestre cada número entero solo una vez. – seancarmody
He comparado el tiempo: ¡mi respuesta es definitivamente más lenta de ejecutar! – seancarmody
@seancarmody Gracias por destacar el requisito de enteros ** únicos **. Editaré mi respuesta. – Andrie