1

たとえば、次の列を持つデータフレームがあります: namenmeanおよびsdrdaリストの要素を抽出して単一のファイルに保存するにはどうすればよいですか。ファイルには、リストではなく、生成されたデータセットが含まれている必要があります。

random.r <- function(df, filename) {
  save.random <- function(name, n, mean, sd) {
    rn <- rnorm(n=n, mean=mean, sd=sd)
    assign(deparse(name), rn)
  }

  rlist <- sapply(1:nrow(df), function(x) 
    save.random(df$name[x], df$n[x],df$mean[x],df$sd[x],simplify = FALSE))
  save(list = rlist, file = paste(filename,".Rda",sep=""), envir = .GlobalEnv)    
}

乾杯

4

1 に答える 1

3

トリックは、 で参照されているオブジェクトの場所を R に伝えることですsave。これを行うには、リスト自体を環境として提供します。

save(list=names(rlist), file=..., envir=as.environment(rlist))

listまた、はオブジェクト名のベクトルである必要があることに注意してください。後者は数値ベクトルのリストであるため、names(rlist)単に ではなく である必要があります。rlist

以下は、random.r意図したとおりに動作する の変更です。この投稿の最後に、同じことを実現する単純化されたコードも提供します。

random.r <- function(df, filename) {
  save.random <- function(name, n, mean, sd) {
    rnorm(n=n, mean=mean, sd=sd)
  }

  rlist <- setNames(lapply(1:nrow(df), function(x) {
    save.random(df$name[x], df$n[x], df$mean[x], df$sd[x])
  }), df$name)
  save(list = names(rlist), file = paste0(filename, ".rda"), 
       envir = as.environment(rlist))    
}

上記の主な変更点は、names(rlist)保存する要素名のリスト (ベクトル) としての指定とas.environment(rlist)、R がそれらの名前を持つオブジェクトを検索する環境としての指定です。の要素を の結果の要素の名前としてsetNames正しく割り当てるために使用したことにも注意してください。df$namerlist

簡略化されたバージョンは次のようになります。

rlist <- setNames(mapply(rnorm, d$n, d$mean, d$sd), d$name)
save(list=names(rlist), file='~/../Desktop/foo.rda', 
     envir=as.environment(rlist))

あなたの はどこdですかdata.frame。ここにmapply、便利なショートカットがあります。ベクトルをステップ実行し、d$n同時にd$mean毎回d$sd実行しrnormます。

もちろん、必要に応じて単純化されたコードを関数にラップすることもできます。

f <- function(x, filename) {
  rlist <- setNames(mapply(rnorm, x$n, x$mean, x$sd), x$name)
  save(list=names(rlist), file=paste0(filename, '.rda'), 
       envir=as.environment(rlist))
}

d <- data.frame(name=LETTERS, n=sample(100, 26), mean=runif(26), sd=runif(26),
                stringsAsFactors=FALSE)

f(d, '~/../Desktop/foo')
于 2014-02-16T09:14:08.573 に答える