2012-05-18 7 views
11

estoy bucle a través de una lista de tramas de datos en R y quiero utilizar sus nombres como parte del nombre de archivo puedo guardar mis parcelas bajo.¿Cómo convertir el nombre de un dataframe en una cadena en R?

El código siguiente es mi intento de iteración a través de tramas de datos, el trazado de la primera columna (Q1) frente a su segundo (var2) y guardando 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(); 
} 

espero este bucle para producir archivos PDF con los nombres de archivo de la forma "first.data_var1_vs_var2.pdf", sino que el nombre de la trama de datos se sustituye con la primera columna del marco y así me sale algo como "c (1, 2, 3, 4) _var1_vs_var2.exchemVbuffer.pdf".

+0

Es más difícil y menos probable que obtendrá una respuesta como su código no es reproducible (es decir, que no se puede ejecutar porque no se han suministrado un conjunto de datos). Echa un vistazo a esta [LINK] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example) para aprender cómo hacer esto. –

+2

Pasa por los nombres de la lista en lugar de los elementos de la lista. – Aaron

Respuesta

18

La única manera que conozco para trabajar de esta manera directamente sobre las tramas de datos en una lista sería adjuntar un comentario que contiene el nombre, que luego se puede utilizar para llevar su nombre dentro del bucle:

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(); 
} 

(usted pierde los nombres de los objetos a los que se pasan como las variables de bucle. Si lo hace deparse(substitute()) dentro de ese bucle, que se obtiene "trama de datos" en lugar de los nombres originales.) La otra forma sería utilizar nombres de las tramas de datos, pero luego deberá usar get o do.call, lo que puede ser un poco más complicado. De esta manera parece bastante sencillo.

+0

Eso es genio, nunca pensé en eso. +1 –

+0

Un poco menos automatizado de lo que esperaba. Si tuviera numerosos marcos de datos, este método podría volverse difícil de manejar. Sin embargo, hace el trabajo para mi caso particular de cinco marcos de datos. ¡Muchos gracias! – holocronweaver

8

solución ligeramente diferente:

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 poco demasiado detallado para mis gustos, pero una variación interesante. Gracias por la contribución. – holocronweaver

8

El código de abajo responde a la pregunta del título, pero puede o no ser de cualquier ayuda con respecto a la cuestión en el cuerpo del mensaje:

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" 

encontré esta solución aquí:

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

después de una búsqueda bastante extensa y se pensó si sería útil para otros incluir el código con la pregunta actual, que es el primer golpe que obtengo al buscar en Internet: convert data frame name to string r.

La respuesta por BondedDust menciona deparse.

Aquí es el código que aparece a abordar la cuestión en el cuerpo del mensaje. A pesar de que me he dejado el código para la generación de parcela:

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

Para otros: solo tenga en cuenta que la respuesta simple es 'deparse (sustituto (your_df))'. –

Cuestiones relacionadas