1

例如,我有一个包含列的数据框:namen和。如何提取列表元素并将其保存到单个文件中。该文件应包含生成的数据集而不是列表。meansdrda

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$name为 的结果元素的名称rlist

一个简化的版本是:

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$nd$meand$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 回答