20

Rでデータフレームのリストをループしており、プロットを保存するファイル名の一部としてそれらの名前を使用したいと考えています。

以下のコードは、データフレームを反復処理し、最初の列 (var1) と 2 番目の列 (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」が取得されます。)他の方法は、データフレームの名前を使用することですが、getまたはを使用する必要がありますが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 に答える