2010-04-20 17 views
69

È possibile creare nuovi nomi di variabili al volo?Come nominare le variabili al volo?

Mi piacerebbe leggere i frame di dati da un elenco in nuove variabili con numeri alla fine. Qualcosa di simile 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?

+7

Finché stiamo distribuendo tag r-faq, forniamo il collegamento (Domande frequenti 7.21: http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I -turn-a-string-in-a-variable_003f) –

risposta

93

Usa assegnazione:

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

Ecco come fare. C'è una meta-domanda qui che è, "Dovrei fare questo?" La risposta è quasi sempre "no". Gli elementi denominati in un elenco sono quasi sempre preferiti. –

+17

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

+8

Beh, certo. Ma la maggior parte delle persone che cercano questa risposta non lo fanno da una posizione di rifiuto di un elenco per la loro applicazione. –

30

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

Di solito si sta creando 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 

In caso contrario, assign è proprio quello che si vuole.

+9

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. –

+8

+1 (Domande frequenti 7.21: http://cran.r-project.org/doc/FAQ/R-FAQ.html#How-can-I-turn-a-string-into-a-variable_003f) discute molto bene –

0

Un'altra soluzione è difficile dare un nome elementi della lista 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 
+13

difficile, ma non saggio. se la risposta è 'attach', di solito stai facendo la domanda sbagliata ... –

9

Non fare frame di dati. Mantieni la lista, dai il nome agli elementi ma non allegarla.

La ragione principale di ciò è che se si creano variabili in movimento, quasi sempre si dovrà successivamente ripetere ciascuna di esse per eseguire qualcosa di utile. Lì sarai nuovamente obbligato a scorrere tutti i nomi che hai creato al volo.

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

Per quanto riguarda il collegamento, la sua pratica di programmazione davvero negativa in R e può portare a molti problemi se non si presta attenzione.

-2

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 manca la prima riga e poi ti dà il messaggio di errore.

+3

Questo non risolve la domanda dell'OP. Abbiamo una lista con i dataframes e vogliamo assegnarla ai dataframes, denominati orca1, orca2, ecc. – zx8754