Ich versuche R zu lernen und kann nicht herausfinden, wie ich an eine Liste anhängen soll.
Wenn dies Python wäre, würde ich. . .
#Python
vector = []
values = ['a','b','c','d','e','f','g']
for i in range(0,len(values)):
vector.append(values[i])
Wie machst du das in R?
#R Programming
> vector = c()
> values = c('a','b','c','d','e','f','g')
> for (i in 1:length(values))
+ #append value[i] to empty vector
vector = values
; oder Sie könnten vector = vector + values tun. Aber ich könnte Ihren Anwendungsfall falsch verstehenAntworten:
Das Anhängen an ein Objekt in einer for-Schleife bewirkt, dass das gesamte Objekt bei jeder Iteration kopiert wird, was dazu führt, dass viele Leute sagen "R ist langsam" oder "R-Schleifen sollten vermieden werden".
Wie BrodieG in den Kommentaren erwähnt hat: Es ist viel besser, einen Vektor der gewünschten Länge vorab zuzuweisen und dann die Elementwerte in der Schleife festzulegen .
Es gibt verschiedene Möglichkeiten, Werte an einen Vektor anzuhängen. Alle von ihnen sind entmutigt.
Anhängen an einen Vektor in einer Schleife
help("append")
hätte Ihre Frage beantwortet und die Zeit gespart, die Sie zum Schreiben dieser Frage benötigt haben (hätte aber dazu geführt, dass Sie schlechte Gewohnheiten entwickelt haben). ;-);Beachten Sie, dass dies
vector <- c()
kein leerer Vektor ist. es istNULL
. Wenn Sie einen leeren Zeichenvektor möchten, verwenden Sievector <- character()
.Ordnen Sie den Vektor vor dem Schleifen vorab zu
Wenn Sie unbedingt eine for-Schleife verwenden müssen, sollten Sie den gesamten Vektor vor der Schleife vorab zuweisen. Dies ist viel schneller als das Anhängen für größere Vektoren.
quelle
vector <- character(length(values)); for(...
)?FWIW: analog zu pythons append ():
quelle
b <- 1; b <- append(b, 2)
. Aber wie Sie bereits erwähnt haben, ist c () eine eher R-Methode, um Dinge zu tun.Sie haben einige Möglichkeiten:
c(vector, values)
append(vector, values)
vector[(length(vector) + 1):(length(vector) + length(values))] <- values
Der erste ist der Standardansatz. Mit dem zweiten können Sie einen anderen Ort als das Ende anhängen. Der letzte ist etwas verzerrt, hat aber den Vorteil, dass er geändert werden kann
vector
(obwohl dies wirklich genauso einfach möglich istvector <- c(vector, values)
.Beachten Sie, dass Sie in R keine Vektoren durchlaufen müssen. Sie können sie nur als Ganzes bearbeiten.
Dies ist auch ziemlich grundlegend, so dass Sie einige der Referenzen durchgehen sollten .
Einige weitere Optionen basierend auf OP-Feedback:
quelle
c
um append Datenrahmen anstelle von Vektoren?Der Vollständigkeit halber ist das Anhängen von Werten an einen Vektor in einer for-Schleife nicht wirklich die Philosophie in R. R funktioniert besser, wenn Vektoren als Ganzes bearbeitet werden, wie @BrodieG hervorhob. Überprüfen Sie, ob Ihr Code nicht wie folgt umgeschrieben werden kann:
Die Ausgabe ist ein Vektor von Rückgabewerten. Sie können auch verwenden,
lapply
wenn Werte eine Liste anstelle eines Vektors sind.quelle
Manchmal müssen wir Schleifen verwenden, wenn wir beispielsweise nicht wissen, wie viele Iterationen wir benötigen, um das Ergebnis zu erhalten. Nehmen Sie als Beispiel while-Schleifen. Nachfolgend finden Sie Methoden, die Sie unbedingt vermeiden sollten:
Diese sind sehr ineffizient, da R den Vektor jedes Mal kopiert, wenn er angehängt wird.
Der effizienteste Weg zum Anhängen ist die Verwendung des Index. Beachten Sie, dass ich es diesmal 1e7 Mal iterieren lasse, aber es ist immer noch viel schneller als
c
.Das ist akzeptabel. Und wir können es ein bisschen schneller machen durch den Austausch
[
mit[[
.Vielleicht haben Sie bereits bemerkt, dass
length
dies zeitaufwändig sein kann. Wenn wir durchlength
einen Zähler ersetzen :Wie andere Benutzer bereits erwähnt haben, ist die Vorabzuweisung des Vektors sehr hilfreich. Dies ist jedoch ein Kompromiss zwischen Geschwindigkeit und Speichernutzung, wenn Sie nicht wissen, wie viele Schleifen Sie benötigen, um das Ergebnis zu erhalten.
Eine Zwischenmethode besteht darin, nach und nach Ergebnisblöcke hinzuzufügen.
quelle
In R können Sie Folgendes ausprobieren:
quelle
quelle
Was Sie im Python-Code verwenden, wird in Python als Liste bezeichnet und unterscheidet sich grundlegend von R-Vektoren, wenn ich das bekomme, was Sie tun möchten:
quelle