我正在循环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“。
答案 0 :(得分: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();
}
(当它们作为循环变量传递时,你确实丢失了对象的名称。如果你在该循环中执行deparse(substitute())
,则得到“dataFrame”而不是原始名称。)另一种方式是使用数据帧的名称,但是您需要使用get
或do.call
,这可能会有点麻烦。这种方式看起来相当简单。
答案 1 :(得分: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"
我在这里找到了这个解决方案:
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"
答案 2 :(得分: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()
}