例如,我有一个包含列的数据框:name
,n
,mean
和sd
。如何将列表元素提取并保存到单个rda
文件中。该文件应包含生成的数据集,而不是列表。
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)
}
干杯
答案 0 :(得分:2)
诀窍是告诉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$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')