2012-05-18 18 views
11

Sto eseguendo il ciclo su un elenco di dati in R e voglio usare i loro nomi come parte del nome del file. Salva i miei grafici sotto.Come convertire il nome di un dataframe in una stringa in R?

Il codice seguente è il mio tentativo di scorrere tra i dataframes, riportando la loro prima colonna (var1) rispetto alla loro seconda (var2) e quindi salvando la trama.

first.data = data.frame(var1 = 1:4, var2 = 5:8); 
second.data = data.frame(var1 = 9:12, var2 = 13:16); 

for (dataFrame in list(first.data, second.data)) { 
    plot(dataFrame[["var1"]], dataFrame[["var2"]]); 
    dev.copy(pdf, paste(dataFrame, "_var1_vs_var2.pdf", sep="")); 
    dev.off(); 
} 

mi aspetto che questo ciclo di produrre file PDF con nomi di file della forma "first.data_var1_vs_var2.pdf", ma invece il nome del data frame viene sostituito con la prima colonna nel telaio e quindi ottenere qualcosa di simile "c (1, 2, 3, 4) _var1_vs_var2.exchemVbuffer.pdf".

+0

E 'più difficile e meno probabile che si otterrà una risposta il tuo codice non è riproducibile (cioè non riesco a farlo funzionare perché non avete fornito un set di dati). Dai un'occhiata a questo [LINK] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) per imparare come farlo. –

+2

Passa attraverso i nomi della lista invece degli elementi della lista. – Aaron

risposta

18

L'unico modo che conosco per lavorare in questo modo direttamente sui dataframes in una lista sarebbe quello di collegare un commento che contiene il nome, che è possibile utilizzare per portare il suo nome all'interno del ciclo:

df1 <- data.frame(var1=rnorm(10), var2=rnorm(10)) 
df2 <- data.frame(var1=rnorm(10), var2=rnorm(10)) 
comment(df1) <- "df1" 
comment(df2) <- "df2" 

for (dataFrame in list(df1,df2)) { 
    dFnm <- comment(dataFrame) 
    pdf(file=paste(dFnm, "_var1_vs_var2.pdf", sep="")) 
    plot(dataFrame[["var1"]], dataFrame[["var2"]])  
    dev.off(); 
} 

(Si perdono i nomi degli oggetti quando vengono passati come variabili del ciclo. Se si fa deparse(substitute()) all'interno di quel ciclo, si ottiene "dataFrame" anziché i nomi originali.) L'altro modo sarebbe utilizzare i nomi dei dataframes, ma poi dovrai usare get o do.call, che potrebbe essere un po 'più incasinato. In questo modo sembra abbastanza semplice.

+0

Questo è genio, non ci hai mai pensato. +1 –

+0

Un po 'meno automatizzato di quanto speravo. Se avessi numerosi frame di dati, questo metodo potrebbe diventare poco pratico. Comunque fa il lavoro per il mio caso particolare di cinque frame di dati. Muchos gracias! – holocronweaver

8

soluzione un po 'diversa:

dataframe1 = data.frame(iv = rnorm(50), dv = rnorm(50)) 
dataframe2 = data.frame(iv = rnorm(50), dv = rnorm(50)) 
dataframe3 = data.frame(iv = rnorm(50), dv = rnorm(50)) 

LIST = list(dataframe1 = dataframe1, 
      dataframe2 = dataframe2, 
      dataframe3 = dataframe3) 


for(i in 1:length(LIST)){ 
    pdf(file=paste(names(LIST)[i], paste(colnames(LIST[[i]]), collapse="."), 
       "pdf", sep=".")) 
    plot(LIST[[i]][,1],LIST[[i]][,2], 
     xlab = colnames(LIST[[i]])[1], 
     ylab = colnames(LIST[[i]])[2], 
     main = paste("Plot based on data in", names(LIST)[i])) 
    dev.off() 
    } 
+0

Un po 'troppo prolisso per i miei gusti, ma una variante interessante. Grazie per il contributo. – holocronweaver

8

Il codice di seguito risponde alla domanda nel titolo, ma può o non può essere di alcun aiuto per quanto riguarda la questione nel corpo del post:

my.data <- read.table(text=' 
    x1 x2  x3 
    1 10 111 
    2 20 222 
    3 30 333 
    4 40 444 
    5 50 555 
', header = TRUE, stringsAsFactors = FALSE) 

my.data 

deparse(substitute(my.data)) 

# [1] "my.data" 

ho trovato questa soluzione qui:

https://www.mail-archive.com/[email protected]/msg60789.html

dopo una ricerca abbastanza estesa e pensato se potrebbe essere utile ad altri per includere il codice con la domanda corrente, che è il primo colpo che ottengo durante la ricerca su Internet per: convert data frame name to string r.

La risposta di BondedDust fa riferimento allo deparse.

Ecco il codice che sembra indirizzare la domanda nel corpo del post. Anche se ho lasciato fuori il codice per la generazione di trama:

df1 <- data.frame(var1=rnorm(10), var2=rnorm(10)) 
df2 <- data.frame(var1=rnorm(10), var2=rnorm(10)) 

list.function <- function() { 

    sapply(c("df1", "df2"), get, environment(), simplify = FALSE) 
} 

my.list <- list.function() 

my.df.names <- names(my.list) 
# [1] "df1" "df2" 

for (i in 1:length(my.list)) { 

    df.name <- my.df.names[i] 
    print(df.name) 

} 

[1] "df1" 
[1] "df2" 
+0

Quindi per gli altri: basti ricordare che la risposta semplice è 'deparse (sostituto (your_df))'. –

Problemi correlati