20

我正在遍历 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();
}

我希望这个循环生成文件名形式为“first.data_var1_vs_var2.pdf”的 PDF 文件,但是数据框的名称被替换为框架中的第一列,所以我得到类似“c(1, 2, 3、4)_var1_vs_var2.exchemVbuffer.pdf"。

4

3 回答 3

27

我知道直接在列表中的数据帧上以这种方式工作的唯一方法是附加一个包含名称的注释,然后您可以使用它在循环中携带其名称:

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”而不是原始名称。)另一种方法是使用数据帧的名称,但随后您将需要使用getor do.call,这可能会有点混乱。这种方式看起来相当简单。

于 2012-05-18T17:17:40.597 回答
17

下面的代码回答了标题中的问题,但对帖子正文中的问题可能有帮助,也可能没有帮助:

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/r-help@r-project.org/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"
于 2014-08-29T12:38:39.383 回答
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()
  }
于 2012-05-18T17:49:51.740 回答