Come denominare le variabili al volo?


96

È possibile creare nuovi nomi di variabili al volo?

Mi piacerebbe leggere i frame di dati da un elenco in nuove variabili con numeri alla fine. Qualcosa come orca1, orca2, orca3 ...

Se provo qualcosa di simile

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

Ottengo questo errore

target of assignment expands to non-language object

C'è un altro modo per aggirare questo?


10
Finché stiamo distribuendo tag r-faq diamo il link (FAQ 7.21: cran.r-project.org/doc/FAQ/… )
Ben Bolker

Risposte:


118

Usa assign:

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

28
Ecco come farlo. C'è una meta-domanda qui che è: "Dovrei farlo?" La risposta è quasi sempre "no". Gli elementi denominati in un elenco sono quasi sempre preferiti.
Ari B. Friedman

26
La risposta è quasi sempre "no" tranne quando non lo è.
Shane

9
Beh, certo. Ma la maggior parte delle persone che cercano questa risposta non lo fa dalla posizione di aver rifiutato un elenco per la loro domanda.
Ari B. Friedman

@Ari B. Friedman Genero i nomi delle variabili per i set di dati che salvo nel mio pacchetto / dati. Ognuno nel suo file con lo stesso nome per il file e i dati in esso contenuti (dato R raccomandazioni per i dati nel pacchetto). Ogni set di dati è di circa 10 milioni e il totale è ~ 17Vo difficilmente vedo un altro modo.
cmbarbu

3
C'è qualche motivo per cui non l'hai usato paste0?
BroVic

33

Mi sembra che si potrebbe essere meglio con una lista piuttosto che usare orca1, orca2ecc, ... allora sarebbe orca[1], orca[2]...

Di solito stai facendo un elenco di variabili differenziate da nient'altro che un numero perché quel numero sarebbe un modo conveniente per accedervi in ​​seguito.

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

Altrimenti, assignè proprio quello che vuoi.


11
Sono d'accordo. Di solito quando le persone pensano di voler nominare le variabili al volo, ciò che vogliono veramente è una diversa struttura dei dati.
Michael Dunn

9
+1 (FAQ 7.21: cran.r-project.org/doc/FAQ/… ) discute bene di questo
Ben Bolker

11

Non creare frame di dati. Conserva l'elenco, nomina i suoi elementi ma non allegarlo.

La ragione principale di ciò è che se crei variabili in movimento, quasi sempre in seguito dovrai scorrere ciascuna di esse per eseguire qualcosa di utile. Lì sarai di nuovo costretto a scorrere ciascuno dei nomi che hai creato al volo.

È molto più facile nominare gli elementi dell'elenco e scorrere i nomi.

Per quanto riguarda l'attaccamento, è davvero pessima pratica di programmazione in R e può portare a molti problemi se non stai attento.


Quindi, fare un allegato, ma solo dopo aver fatto l'iterazione nell'elenco?
Mox

4

FAQ dice:

Se hai

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

tu puoi fare

get(varname[1]) + 2

per

a + 2

o

assign(varname[1], 2 + 2)

per

a <- 2 + 2

Quindi sembra che tu usi GET quando vuoi valutare una formula che utilizza una variabile (come una concatenazione) e ASSIGN quando vuoi assegnare un valore a una variabile pre-dichiarata.

Sintassi per assign: assign (x, value)

x: un nome di variabile, dato come stringa di caratteri. Non viene eseguita alcuna coercizione e verrà utilizzato il primo elemento di un vettore di caratteri di lunghezza maggiore di uno, con un avviso.

valore: valore da assegnare a x.


0

Un'altra soluzione complicata è nominare gli elementi dell'elenco e attach:

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

14
complicato, ma non saggio. se la risposta è attachche di solito fai la domanda sbagliata ...
Ben Bolker

-1

E questa opzione?

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

Funziona perfettamente. Nell'esempio che hai inserito, la prima riga è mancante e quindi ti dà il messaggio di errore.


3
Questo non risponde alla domanda di OP. Abbiamo una lista con dataframe e vogliamo assegnarla a dataframe, denominati orca1, orca2, ecc.
zx8754

"List with dataframes" = "list OF dataframes"?
Mox
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.