Als ich kürzlich nach einer R- Funktion suchte, die Indizes der Top-N-Max / Min-Zahlen in einem bestimmten Vektor zurückgibt, war ich überrascht, dass es keine solche Funktion gibt.
Und das ist etwas sehr Ähnliches.
Die Brute-Force-Lösung mit der Funktion base :: order scheint die einfachste zu sein.
topMaxUsingFullSort <- function(x, N) {
sort(x, decreasing = TRUE)[1:min(N, length(x))]
}
Es ist jedoch nicht das schnellste, wenn Ihr N- Wert im Vergleich zur Länge des Vektors x relativ klein ist .
Auf der anderen Seite, wenn das N wirklich klein ist, können Sie die Funktion base :: whichMax iterativ verwenden und in jeder Iteration den gefundenen Wert durch -Inf ersetzen
# the input vector 'x' must not contain -Inf value
topMaxUsingWhichMax <- function(x, N) {
vals <- c()
for(i in 1:min(N, length(x))) {
idx <- which.max(x)
vals <- c(vals, x[idx]) # copy-on-modify (this is not an issue because idxs is relative small vector)
x[idx] <- -Inf # copy-on-modify (this is the issue because data vector could be huge)
}
vals
}
Ich glaube, Sie sehen das Problem - die Copy-on-Modify-Natur von R. Dies wird also für sehr sehr sehr kleine N (1,2,3) besser funktionieren, aber für größere N-Werte wird es schnell langsamer. Und Sie iterieren über alle Elemente im Vektor x N- mal.
Ich denke, die beste Lösung in sauberem R ist die Verwendung von partieller base :: sort .
topMaxUsingPartialSort <- function(x, N) {
N <- min(N, length(x))
x[x >= -sort(-x, partial=N)[N]][1:N]
}
Dann können Sie das letzte ( N- te) Element aus dem Ergebnis der oben genannten Funktionen auswählen.
Hinweis: Die oben definierten Funktionen sind nur Beispiele. Wenn Sie sie verwenden möchten, müssen Sie die Eingaben überprüfen / überprüfen (z. B. N> Länge (x). ).
Ich habe unter http://palusga.cz/?p=18 einen kleinen Artikel über etwas sehr Ähnliches geschrieben (Indizes der Top-N-Max / Min-Werte eines Vektors abrufen ). Hier finden Sie einige Benchmarks für ähnliche Funktionen, die ich oben definiert habe.
topn
Funktion , die als schneller istsort
,order
undnth
. Schauen Sie sich die Dokumentation an.