Как преобразовать имя фрейма данных в строку в R?

Я перебираю список блоков данных в R и хочу использовать их имена как часть имени файла. Я сохраняю свои графики в разделе.

Ниже приведена моя попытка итерации с помощью фреймов данных, построение их первого столбца (var1) по сравнению с их вторым (var2), а затем сохранение графика.

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

Я ожидаю, что этот цикл создаст файлы PDF с именами файлов "first.data_var1_vs_var2.pdf", но вместо этого имя фрейма данных заменяется первым столбцом в фрейме, и поэтому я получаю что-то вроде "c (1), 2, 3, 4) _var1_vs_var2.exchemVbuffer.pdf".

Ответ 1

Единственный способ, которым я знаю, работать таким образом напрямую на dataframes в списке, - это прикрепить комментарий, содержащий имя, которое вы затем можете использовать для переноса своего имени внутри цикла:

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

(Вы теряете имена объектов, когда они передаются как переменные цикла. Если вы выполняете deparse(substitute()) внутри этого цикла, вы получаете "dataFrame", а не исходные имена.) Другой способ - использовать имена данных, но тогда вам нужно будет использовать get или do.call, что может стать немного беспорядочным. Этот способ кажется довольно простым.

Ответ 2

Немного другое решение:

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

Ответ 3

Код ниже отвечает на вопрос в заголовке, но может или не может помочь в вопросе в теле сообщения:

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"

Я нашел это решение здесь:

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

после довольно обширного поиска и мысли, если может быть полезно другим, чтобы включить код с текущим вопросом, который является первым хитом, который я получаю при поиске в Интернете: convert data frame name to string r.

В ответе BondedDust упоминается deparse.

Вот код, который, как представляется, касается вопроса в теле сообщения. Хотя я оставил код для генерации сюжета:

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"