R bietet max und min, aber ich sehe keinen wirklich schnellen Weg, um den anderen Wert in der Reihenfolge zu finden, außer den gesamten Vektor zu sortieren und dann den Wert x aus diesem Vektor auszuwählen.
Gibt es einen schnelleren Weg, um den zweithöchsten Wert zu erhalten (z. B.)?
Vielen Dank
topn
Funktion , die als schneller istsort
,order
undnth
. Schauen Sie sich die Dokumentation an.Antworten:
Verwenden Sie das
partial
Argument vonsort()
. Für den zweithöchsten Wert:quelle
sort(x, TRUE)[2]
der in der Antwort von @ Abrar beschriebenen, abgesehen davon, dass die Einschränkung in der Frage nicht erfüllt wird?Error in sort.int(x, na.last = na.last, decreasing = decreasing, ...) : index 4705 outside bounds
Irgendeine Idee, woran das liegen könnte? Einige Details: Mein x ist ein numerischer Vektor der Länge 4706 mit einigenNA
s in den Daten. Ich habe versucht, den zweithöchsten Wert im Vektor mit genau demselben Code zu erhalten, den @RobHyndman vorgeschlagen hat.decreasing
Argument nicht mit der Teilsortierung kompatibel ist, können Sie dies immer-sort(-x, partial=n-1)[n-1]
tun. es ist logisch dasselbe und dauert erheblich kürzer alssort(x, decreasing=TRUE)[n-1]
.Etwas langsamere Alternative, nur für die Aufzeichnungen:
quelle
max(x[-which.max(x)])
Ich habe Robs Antwort in eine etwas allgemeinere Funktion zusammengefasst, mit der das 2., 3., 4. (usw.) Maximum ermittelt werden kann:
quelle
maxN(1:10, 1:3)
(ich hätte die Standardeinstellung N auf 1 gesetzt)Rfast hat eine Funktion namens nth_element, die genau das tut, was Sie verlangen, und schneller ist als alle oben beschriebenen Implementierungen
Auch die oben diskutierten Methoden, die auf einer Teilsortierung basieren, unterstützen das Finden der k kleinsten Werte nicht
Gibt das fünftgrößte Element von x zurück, während
Gibt das fünftkleinste Element von x zurück
Benchmarks unten gegen die beliebtesten Antworten.
Für 10 Tausend Zahlen:
Für 1 Million Nummern:
quelle
Rfast::nth
mehrere Elemente (z. B. das 8. und 9. größte Element) sowie die Indizes dieser Elemente zurückgegeben werden können.Hier ist eine einfache Möglichkeit, die Indizes von N kleinsten / größten Werten in einem Vektor zu finden (Beispiel für N = 3):
N Kleinste:
N Größte:
Sie können die Werte also wie folgt extrahieren:
quelle
Für den n-ten höchsten Wert
quelle
Ich habe festgestellt, dass das Entfernen des max-Elements zuerst und das Ausführen eines weiteren max-Elements mit vergleichbarer Geschwindigkeit erfolgt:
quelle
Hier ist der einfachste Weg, den ich gefunden habe:
quelle
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.
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
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 .
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.
quelle
head(sort(x),..)
odertail(sort(x),...)
sollte funktionierenquelle
Diese Funktion gibt eine Matrix mit den oberen n Werten und ihren Indizes zurück. hoffe es hilft VDevi-Chou
quelle
Dies findet den Index des N'ten kleinsten oder größten Wertes im numerischen Eingabevektor x. Setzen Sie in den Argumenten bottom = TRUE, wenn Sie das N'th von unten wollen, oder bottom = FALSE, wenn Sie das N'th von oben wollen. N = 1 und bottom = TRUE ist äquivalent zu which.min, N = 1 und bottom = FALSE ist äquivalent zu which.max.
quelle
dplyr hat die Funktion n-te, wobei das erste Argument der Vektor und das zweite die gewünschte Stelle ist. Dies gilt auch für sich wiederholende Elemente. Beispielsweise:
Den zweitgrößten Wert finden:
quelle
x[[order(order_by)[[n]]]]
- daher muss der gesamte Vektor sortiert werden. Es wird also nicht so schnell sein wie die akzeptierte Antwort.sort
mit dem partiellen = Argument (das alles ändert)dplyr::nth()
?bench::mark(max(x[-which.max(x)]), x[[order(-x)[[2]]]] )
,nth()
Scheint fast 10 - mal langsamer, wolength(x)
3.000.000 ist.Sie können den nächsthöheren Wert mit identifizieren
cummax()
. Wenn Sie beispielsweise die Position jedes neuen höheren Werts möchten, können Sie Ihren Wertevektorcummax()
an diediff()
Funktion übergeben, um Positionen zu identifizieren, an denen sich dercummax()
Wert geändert hat. Sagen wir, wir haben den VektorWenn Sie nun den Ort einer Änderung in finden möchten, stehen
cummax()
Ihnen viele Optionen zur Verfügung, die ich normalerweise verwendesign(diff(cummax(v)))
. Sie müssen sich wegen auf das verlorene erste Element einstellendiff()
. Der vollständige Code für den Vektorv
wäre:quelle
Sie können das
sort
Schlüsselwort folgendermaßen verwenden:Beispiel:
gibt die ersten 5 maximalen Zahlen.
quelle