2012-05-18 6 views
11

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

+0

Сложнее и менее вероятно, что вы получите ответ, поскольку ваш код не воспроизводится (т.е. я не могу запустить его, потому что вы не поставили его набор данных). Ознакомьтесь с этим [LINK] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example), чтобы узнать, как это сделать. –

+2

Пронумеруйте имена списка вместо элементов списка. – Aaron

ответ

18

Единственный способ я знаю, чтобы работать таким образом, непосредственно на 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, что может стать немного беспорядочным. Этот путь кажется довольно простым.

+0

Это гений, никогда не думал об этом. +1 –

+0

Немного менее автоматизирован, чем я надеялся. Если бы у меня было множество фреймов данных, этот метод мог бы стать громоздким. Однако это делает работу для моего конкретного случая из пяти кадров данных. Muchos gracias! – holocronweaver

8

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

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

Немного слишком многословный для моих вкусов, но интересный вариант. Спасибо за вклад. – holocronweaver

8

ниже код отвечает на вопрос в названии, но может или не может быть какой-либо помощи в отношении вопроса в теле поста:

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" 
+0

Итак, для других: просто имейте в виду, что простой ответ - «deparse (substitute (your_df))». –

Смежные вопросы