Wie benenne ich Variablen im laufenden Betrieb?

96

Ist es möglich, neue Variablennamen im laufenden Betrieb zu erstellen?

Ich möchte Datenrahmen aus einer Liste in neue Variablen mit Zahlen am Ende lesen. So etwas wie orca1, orca2, orca3 ...

Wenn ich so etwas versuche

paste("orca",i,sep="")=list_name[[i]]

Ich bekomme diesen Fehler

target of assignment expands to non-language object

Gibt es einen anderen Weg, um das zu umgehen?

Maiasaura
quelle
10
Solange wir R-FAQ-Tags ausgeben , geben wir den Link (FAQ 7.21: cran.r-project.org/doc/FAQ/… )
Ben Bolker

Antworten:

118

Verwendung assign:

assign(paste("orca", i, sep = ""), list_name[[i]])
Shane
quelle
28
So geht's. Hier gibt es eine Meta-Frage: "Soll ich das tun?" Die Antwort lautet fast immer "nein". Benannte Elemente in einer Liste werden fast immer bevorzugt.
Ari B. Friedman
26
Die Antwort lautet fast immer "Nein", außer wenn dies nicht der Fall ist.
Shane
9
Ja, na klar. Die meisten Menschen, die diese Antwort suchen, tun dies jedoch nicht, weil sie eine Liste für ihre Bewerbung abgelehnt haben.
Ari B. Friedman
@Ari B. Friedman Ich generiere Variablennamen für Datensätze, die ich in mypackage / data speichere. Jeder in seiner Datei mit demselben Namen für die Datei und die darin enthaltenen Daten (gegebene R-Empfehlungen für Daten im Paket). Jeder Datensatz ist ungefähr 10 Millionen groß und die Summe ist ~ 17Go sehe ich kaum einen anderen Weg.
cmbarbu
3
Gibt es einen Grund, warum Sie nicht verwendet haben paste0?
BroVic
33

Es scheint mir , dass Sie besser dran mit einer Liste sein könnten anstatt orca1, orca2etc, ... dann wäre es orca[1], orca[2]...

Normalerweise erstellen Sie eine Liste von Variablen, die sich nur durch eine Zahl unterscheiden, da diese Zahl eine bequeme Möglichkeit ist, später darauf zuzugreifen.

orca <- list()
orca[1] <- "Hi"
orca[2] <- 59

Ansonsten assignist genau das, was Sie wollen.

John
quelle
11
Genau. Wenn Leute glauben, Variablen im laufenden Betrieb benennen zu wollen, wollen sie normalerweise eine andere Datenstruktur.
Michael Dunn
9
+1 (FAQ 7.21: cran.r-project.org/doc/FAQ/… ) diskutiert dies gut
Ben Bolker
11

Machen Sie keine Datenrahmen. Behalten Sie die Liste bei, benennen Sie ihre Elemente, aber hängen Sie sie nicht an.

Der Hauptgrund dafür ist, dass Sie, wenn Sie unterwegs Variablen erstellen, fast immer später jede einzelne durchlaufen müssen, um etwas Nützliches auszuführen. Dort werden Sie erneut gezwungen sein, jeden der Namen, die Sie im laufenden Betrieb erstellt haben, zu durchlaufen.

Es ist viel einfacher, die Elemente der Liste zu benennen und die Namen zu durchlaufen.

Was das Anhängen betrifft, ist es eine wirklich schlechte Programmierpraxis in R und kann zu großen Problemen führen, wenn Sie nicht vorsichtig sind.

Sidquanto
quelle
Machen Sie also einen Anhang, aber erst, nachdem Sie die Liste durchlaufen haben?
Mox
4

FAQ sagt:

Wenn Sie haben

varname <- c("a", "b", "d")

du kannst tun

get(varname[1]) + 2

zum

a + 2

oder

assign(varname[1], 2 + 2)

zum

a <- 2 + 2

Es sieht also so aus, als würden Sie GET verwenden, wenn Sie eine Formel auswerten möchten, die eine Variable verwendet (z. B. eine Verkettung), und ASSIGN, wenn Sie einer vordeklarierten Variablen einen Wert zuweisen möchten.

Syntax für zuweisen: zuweisen (x, Wert)

x: Ein Variablenname, der als Zeichenfolge angegeben wird. Es wird kein Zwang ausgeübt, und das erste Element eines Zeichenvektors mit einer Länge von mehr als eins wird mit einer Warnung verwendet.

Wert: Wert, der x zugewiesen werden soll.

Mox
quelle
0

Eine andere schwierige Lösung besteht darin, Elemente der Liste zu benennen und attachFolgendes:

list_name = list(
    head(iris),
    head(swiss),
    head(airquality)
    )

names(list_name) <- paste("orca", seq_along(list_name), sep="")
attach(list_name)

orca1
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species
# 1          5.1         3.5          1.4         0.2  setosa
# 2          4.9         3.0          1.4         0.2  setosa
# 3          4.7         3.2          1.3         0.2  setosa
# 4          4.6         3.1          1.5         0.2  setosa
# 5          5.0         3.6          1.4         0.2  setosa
# 6          5.4         3.9          1.7         0.4  setosa
Marek
quelle
14
knifflig, aber nicht weise. Wenn die Antwort lautet, stellen attachSie normalerweise die falsche Frage ...
Ben Bolker
-1

Und diese Option?

list_name<-list()
for(i in 1:100){
    paste("orca",i,sep="")->list_name[[i]]
}

Es funktioniert perfekt. In dem von Ihnen angegebenen Beispiel fehlt die erste Zeile und Sie erhalten die Fehlermeldung.

gla
quelle
3
Dies geht nicht auf die Frage von OP ein. Wir haben eine Liste mit Datenrahmen, und wir möchten sie Datenrahmen zuweisen, die als orca1, orca2 usw. bezeichnet werden
zx8754
"Liste mit Datenrahmen" = "Liste der Datenrahmen"?
Mox