Betrachten Sie Folgendes:
%Vor%Dies gibt mir die richtige Ausgabe:
%Vor%Zum Beispiel ist der (Spalten-) Vektor hier
%Vor% Ganz oben 5000
, darüber liegen keine Werte. Dies ergibt den Wert 0
.
Bei 6000
gibt es einen Wert, der darüber liegt und weniger als 6000
: 5000
. Dies ergibt den Wert 1
.
Bei 5500
gibt es darüber zwei Werte, von denen einer kleiner als 5500
ist, also ergibt dies den Wert 1
usw.
Gibt es eine Möglichkeit, dies ohne eine Schleife zu schreiben?
Ein anderer Ansatz, der der Aichao-Lösung sehr ähnlich ist (aber ein bisschen kürzer)
%Vor%Bearbeiten (Leistung): Vielleicht wurde meine Idee als akzeptierte Antwort ausgewählt, weil es sich um einen kurzen und selbsterklärenden Code handelt - aber seien Sie vorsichtig bei großen Vektoren! Es ist der langsamste Ansatz aller hier vorgeschlagenen Lösungen! Ähnlich wie bei Dracodoc habe ich auch ein Mikrobenchmark gemacht. Aber ich habe einen zufällig generierten Vektor von 3000 Werten verwendet, um signifikantere Laufzeiten zu erhalten:
%Vor%Wir sehen, dass die Apply-Methode für einen großen Vektor und ohne den Overhead eines Datenrahmens etwas schneller ist als die for-Schleife.
Mein äußerer Produktansatz benötigt mehr als die doppelte Zeit.
Ich würde also empfehlen, die for-Schleife zu verwenden - sie ist auch lesbar und schneller. Mein Ansatz könnte in Betracht gezogen werden, wenn Sie einen nachweisbaren korrekten Code haben möchten (da dieser Einzeiler einer Spezifikation des Problems ziemlich nahe kommt).
EDIT: Ich sollte einen größeren Datensatz für den Benchmark verwenden, der winzige Datensatz macht die Benchmark-Ergebnisse ein wenig irreführend. Siehe PatrickRoocks Update.
Ich habe gerade gesagt, dass for-Schleife ist nicht unbedingt schlecht als Familie anwenden, dann sah ich das.
Ich habe einen Mikrobenchmark gemacht, der eine optimierte for-Schleife und die Sapply-Methode vergleicht. for-Schleife ist 6 mal schneller. Die Sapply-Methode ist keine richtige Funktion, sondern modifiziert sie zu einer Funktion, die einen Vektor nimmt, anstatt anzunehmen, dass Datenrahmenspalten sich ein wenig verbessern könnten.
%Vor%Aktualisierung:
%Vor% For-Schleife gewinnt immer noch.
Übertragen Sie einen Vektor anstelle von df$X
speichern Sie Zeit für alle, also gebe ich 3 Lösungen gleichen Vektor, um vergleichbar zu sein.
Parfaits Antwort ist vergleichbar mit Patrick Roocks.
Neben der Leistung gibt es einen subtilen Punkt der Korrektheit.
Die Funktion von OP und die Summe von Parfait (v [i: 1] & lt; v [i]) geben nur dann eine korrekte Antwort, weil v [i] & lt; v [i] ist FALSCH. Per Definition sollte v [1: (i-1)] & lt; v [i].
Meine Funktion kann in einer prägnanteren Version wie folgt geschrieben werden:
%Vor%Es sieht besser aus und gibt korrekte Ergebnisse. Dies hängt auch von v [1] & lt; v [1] ist FALSCH. Es ist nicht unbedingt falsch, da es nur um die erste Zeile geht, obwohl ich immer noch die längere, aber offensichtlichere Version bevorzugen würde.
Tags und Links r