【发布时间】:2014-12-16 03:41:43
【问题描述】:
我正在寻找正确的 R 习惯用法来对一组参数运行一个函数并从结果中创建一个长数据框。假设您有以下玩具功能:
fun <- function(sd, mean, foobar = "foobar") {
list(random = rnorm(10) * sd + mean + 1:10, foobar = foobar)
}
现在您想在 sd 和 mean 的不同值上运行 fun:
par_sd <- rep(1:5, 3)
par_mean <- rep(0:2, each = 5)
pars <- data.frame(sd = par_sd, mean = par_mean)
我想对pars 的每一行中的参数运行fun,并将结果收集到具有sd、mean、pos、value 列的数据框中。这是一个相当笨拙的解决方案:
set.seed(42)
## Run fun
res <- lapply(seq_len(nrow(pars)), function(x) {
do.call(fun, as.list(pars[x, ]))
})
## Select the result we need
res <- lapply(res, "[[", "random")
## Make it a single data frame
res <- do.call(rbind, res)
## Together with the parameters
res <- as.data.frame(cbind(sd = par_sd, mean = par_mean, res))
colnames(res) <- c("sd", "mean", 1:10)
## Make it a long data frame
res <- reshape2::melt(res, id.vars=c("sd", "mean"),
variable.name = "pos", value.name="value")
## Done
res[1:5,]
#> sd mean pos value
#> 1 1 0 1 2.37095845
#> 2 2 0 1 3.60973931
#> 3 3 0 1 0.08008422
#> 4 4 0 1 2.82180049
#> 5 5 0 1 2.02999300
有没有更简单的方法来做到这一点?任何人都知道一个包做这样的事情?我的快速搜索没有给出任何好的结果...
【问题讨论】:
-
哪些部分是固定的,哪些部分要改进?我们可以改变所有的数据结构吗?
-
你可以随意改变,除了
fun函数和结果的格式。 -
作为初步建议,
do.call(Map, c(fun,pars) )会给你res