提取lapply或mclapply的结果

3

我目前正在运行许多类似这样的应用程序:

test=data.frame(t=seq(1,5,1),e=seq(6,10,1))
mean(apply(test,2,mean))

我希望将第二行转换为mclapply,以产生与lapply相同的结果。我意识到可以使用for循环从lapply语句中提取每个项目,然后在该向量上使用mean,但这会降低性能,我正试图通过使用mclapply来改进性能。问题是lapply和mcapply都返回一个列表,mean无法使用。我可以使用[[]]获取实际值或test$t和test$e,但test中的列数是可变的,通常超过1,000个。必须有一种更简单的方法来处理这个问题。基本上,我想得到这个语句的平均值:

mclapply(test,mean,mc.preschedule=TRUE)

最好不要生成新的变量或使用for循环。解决方案应等同于获得以下语句的平均值:

lapply(test,mean)
2个回答

2

我有点困惑——毕竟,data.frame本质上也是一个list。除了显而易见的区别之外,

R> testdf <- data.frame(t=seq(1,5,1),e=seq(6,10,1))
R> mean(testdf)
t e 
3 8 
R> mean(mean(testdf))
[1] 5.5
R> 

你还可以这样做
R> lapply(testdf, mean)
$t
[1] 3

$e
[1] 8

R> mean(unlist(lapply(testdf, mean)))
[1] 5.5
R> 

所以对于内部的lapply,你可以根据需要使用mclapply,是吗?

使用mclapply的目的是将6小时的模拟转换为3小时的模拟,因此即使elegant的mean(mean(test))不能加速模拟。 unlist解决方案正是我所需要的!非常感谢!现在我只需用mclapply替换lapply并将模拟时间减半即可! - ProbablePattern
现在我只需要将lapply替换为mclapply,就可以将模拟时间减半!也许吧。请记住,并行化某些内容是有固定成本的;线程需要被初始化等等。 - Vince
是的,mean(mean(testdf)) 只是为了确定您没有展示的总体平均值。我知道这只是一个样式化的例子。很高兴能够帮助到您。 - Dirk Eddelbuettel
真的,没错。你为什么要打破我的幻想呢 :) 我知道它不是完全按照那样工作的,但在6小时模拟中,4个核心应该比1个核心快得多。 - ProbablePattern
1
这完全取决于情况。对于某些事情,您可能会获得接近线性的加速,而对于其他事情则不会。这就是后续问题的用途 :) - Dirk Eddelbuettel

0

我喜欢将mclapply()的结果放在一个列表中,然后将这些列表组合成最终产品:

results.list <- list()
results.list <- mclapply(listOfData, analysisFunction, mc.cores = 7)

library(data.table)
result <- rbindlist(results.list) 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接