Angenommen, Sie beginnen mußten = 3, Ende = 7, und Sie haben jeweils als ‚1‘ auf einer Reihe Linie markiert
starts: 0 0 1 0 0 0 0 0 0 ...
ends + 1: 0 0 0 0 0 0 0 1 0 ...
die kumulative Summe der Starts minus die kumulative Summe der Enden beginnend bei 1, und die Differenz zwischen den beiden ist
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
und die Positionen der 1en in der diff sind
which(diff > 0): 3 4 5 6 7
Verwenden tabellieren für mehrere Anläufe/endet an der gleichen Stelle zu ermöglichen, und
range2 <- function(ranges)
{
max <- max(ranges)
starts <- tabulate(ranges[,1], max)
ends <- tabulate(ranges[,2] + 1L, max)
which(cumsum(starts) - cumsum(ends) > 0L)
}
Für die Frage, gibt dieser
> eg <- matrix(c(1, 3, 10, 5, 6, 13), 3)
> range2(eg)
[1] 1 2 3 4 5 6 10 11 12 13
Es ist ziemlich schnell, für Andrie dem Beispiel
> system.time(runs <- range2(xx))
user system elapsed
0.108 0.000 0.111
(das klingt ein bisschen wie DNA Seque nce Analyse, für die GenomicRanges Ihr Freund sein könnte; Sie würden die Funktionen coverage
und slice
auf Lesevorgänge verwenden, vielleicht Eingabe mit readGappedAlignments
).
Ich denke, dass das OP will das Ergebnis, um jede ganze Zahl nur einmal zu kennzeichnen. – seancarmody
Ich habe das Timing verglichen: Meine Antwort ist definitiv langsamer zu laufen! – seancarmody
@seancarmody Vielen Dank für die Hervorhebung der Anforderung für ** einzigartige ** Ganzzahlen. Ich werde meine Antwort bearbeiten. – Andrie