Ich denke, ich muss dies eine vollständige Antwort machen, weil ich Kommentare schwerer zu verfolgen finde und ich habe bereits einen Kommentar zu diesem Thema verloren ... Es gibt ein Beispiel von nullglob, das die Unterschiede zwischen zeigt und viele Familienfunktionen anwenden besser als andere Beispiele. Wenn man die Funktion so ausführt, dass sie sehr langsam ist, dann wird die ganze Geschwindigkeit verbraucht und man findet keine Unterschiede zwischen den Variationen der Schleifen. Aber wenn Sie die Funktion trivial machen, können Sie sehen, wie sehr die Schleifen die Dinge beeinflussen.
Ich möchte auch hinzufügen, dass einige Mitglieder der Anwendungsfamilie, die in anderen Beispielen unerforscht sind, interessante Leistungseigenschaften haben. Zuerst zeige ich Replikationen der relativen Ergebnisse von Nullglob auf meinem Rechner.
n <- 1e6
system.time(for(i in 1:n) sinI[i] <- sin(i))
user system elapsed
5.721 0.028 5.712
lapply runs much faster for the same result
system.time(sinI <- lapply(1:n,sin))
user system elapsed
1.353 0.012 1.361
Er fand auch sapply viel langsamer. Hier sind einige andere, die nicht getestet wurden.
Plain alter zu einer Matrix Version der Daten gilt ...
mat <- matrix(1:n,ncol =1),1,sin)
system.time(sinI <- apply(mat,1,sin))
user system elapsed
8.478 0.116 8.531
Also, die apply() Befehl selbst ist wesentlich langsamer als die for-Schleife. (For-Schleife wird nicht verlangsamt deutlich, wenn ich sin verwenden (mat [i, 1]).
eine andere, die nicht in anderen Beiträgen getestet zu sein scheint ist tapply.
system.time(sinI <- tapply(1:n, 1:n, sin))
user system elapsed
12.908 0.266 13.589
Natürlich man würde niemals tapply auf diese Weise verwenden, und sein Nutzen liegt in den meisten Fällen weit über einem solchen Geschwindigkeitsproblem
Wie ist das anders als df [, "Spalte1"]? Siehe auch apply with margin = 1. – Greg
Das Beispiel war nicht das, was ich wirklich machen wollte. Ich wollte einige Werte im Datenrahmen als Daten in einer Javascript-Datei schreiben. +1 für die Information über "margin" in "apply". –
Ich musste die Zeilen durchlaufen, um Werte in Spalten in bestimmten Situationen zu verschieben. Ich wurde daran erinnert, dass der bessere Weg, dies in R zu tun ist: http://stackoverflow.com/questions/7746567/how-to-swap-values-between-2-columns – thadk