【问题标题】:parLapply in R - dataframesR中的parLapply - 数据帧
【发布时间】:2017-10-10 15:02:08
【问题描述】:

我在尝试恢复 R 中 parLapply 算法已经弹出的数据帧时遇到问题。

我在下一个示例中附上了 iris 数据集来说明问题。 我创建了一个函数,它对每个 iris Species 进行线性模型,然后在它们上应用一个循环。

uniques<-unique(iris$Species)

model<-function(i){
    table<-iris[iris$Species==uniques[i],]
    fit<-lm(Petal.Width ~ Petal.Length + Sepal.Width + Sepal.Length, data=table)
    predicted_df <- data.frame(pred = predict(fit, table), table)
    assign(paste0("predicted_df_",i),predicted_df,envir = .GlobalEnv)
}

#Loop over Species
loop<-  for (i in 1:3){
  model(i)
}

这里,树数据库(“predicted_df_1/2/3”)正确出现在本地环境中。

当我使用 parLapply 算法执行相同的操作时,我找不到数据帧在哪里或如何将它们带到本地环境。没有显示错误。

library("foreach")
library("doParallel")

cl <- makeCluster(mc <- getOption("cl.cores", 4))
clusterExport(cl=cl, varlist=c("iris"))
clusterEvalQ(cl, library(DAAG))

registerDoParallel(cl) # register the cluster
system.time(
  df <- parLapply(cl, 1:3, 
                    function(i) {
                      tryCatch({  model(i)}, error=function(e){cat("ERROR :",conditionMessage(e), "\n")})
                    })
)
stopCluster(cl)

有人如何帮助我完成这项任务?谢谢!

【问题讨论】:

    标签: r parallel-processing


    【解决方案1】:

    简单地使用

    model<-function(i){
        table<-iris[iris$Species==uniques[i],]
        fit<-lm(Petal.Width ~ Petal.Length + Sepal.Width + Sepal.Length, data=table)
        data.frame(pred = predict(fit, table), table)
    }
    

    然后您将从parLapply 获得一个大小为 3 的列表,其中包含您想要的预测。


    当您使用并行性时,您不能分配给全局环境,因为这不是您的主要 R 会话来完成这项工作。

    【讨论】:

    • 是的,这只是一个例子。真实数据包含超过 20k 次迭代,因此,如果我应用一个简单的循环,则任务需要很多小时。因此,使用并行性,匹配过程会更快。
    • @lolo 我不明白。我只是给了你并行化你的问题的解决方案,并不是说你不需要并行化它。
    猜你喜欢
    • 2022-01-13
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    相关资源
    最近更新 更多