【问题标题】:Extracting lapply or mclapply results提取 lapply 或 mclapply 结果
【发布时间】:2010-08-31 21:26:54
【问题描述】:

我目前正在运行许多如下所示的应用行:

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

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

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

最好不生成新变量或使用 for 循环。解应该相当于得到这个语句的均值:

lapply(test,mean)

【问题讨论】:

    标签: r


    【解决方案1】:

    我很困惑——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 小时的模拟,因此 mean(mean(test)) 而优雅不会加速模拟。 unlist 解决方案正是我所需要的!非常感谢!现在我可以用 mclapply 代替 lapply 并将我的模拟时间缩短一半!
    • "现在我可以用 mclapply 代替 lapply 并将我的模拟时间缩短一半!"也许。请记住,并行化某些东西是有固定成本的;需要启动线程等。
    • 是的,mean(mean(testdf)) 只是为了确定您未显示的总体平均值。我知道这是一个程式化的例子。很高兴能帮上忙。
    • 真的,真的。破灭我的泡沫,你为什么不呢:)我明白它不能完全像那样工作,但在 6 小时的模拟中,4 核应该比 1 核快得多。
    • 这一切都取决于。对于某些事情,您可能会获得近乎线性的加速,而对于其他事情则不会。这就是后续问题的用途:)
    【解决方案2】:

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

    results.list <- list()
    results.list <- mclapply(listOfData, analysisFunction, mc.cores = 7)
    
    library(data.table)
    result <- rbindlist(results.list) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-19
      相关资源
      最近更新 更多