Как преобразовать имя фрейма данных в строку в 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"