如何将数据帧的名称转换为R中的字符串?

hol*_*ver 13 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();
}
Run Code Online (Sandbox Code Playgroud)

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

42-*_*42- 21

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

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();
}
Run Code Online (Sandbox Code Playgroud)

(当它们作为循环变量传递时,你确实丢失了对象的名称.如果你deparse(substitute())在循环内部进行,你得到"dataFrame"而不是原始名称.)另一种方法是使用数据帧的名称,但是你将需要使用getdo.call,这可能会有点麻烦.这种方式看起来相当简单.


Mar*_*ler 12

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

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"
Run Code Online (Sandbox Code Playgroud)

我发现这个解决方案:

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"
Run Code Online (Sandbox Code Playgroud)

  • 所以对其他人:请记住,简单的答案是`deparse(substitute(your_df))`。 (3认同)

Ale*_*lex 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()
  }
Run Code Online (Sandbox Code Playgroud)