使用foreach包将行附加到dataframe

ifr*_*eak 7 parallel-processing foreach r

我在使用并行处理将值附加到数据框时遇到问题.

我有一个函数会做一些计算并返回一个数据帧,包括这些计算是一个随机抽样.

所以我做的是:

randomizex <- function(testdf)
{
    foreach(ind=1:1000)%dopar%
    {
      testdf$X = sample(testdf$X,nrow(testdf), replace=FALSE)
      fit = lm(X ~ Y, testdf)
      newdf <- rbind(newdf, data.frame(pc=ind, err=sum(residuals(fit)^2) ))

    }

return(newdf)
}
resdf = randomizex(mydf)
Run Code Online (Sandbox Code Playgroud)

当我查看结果时resdf,它是空的

如果我更换%dopar%与%do%结果被正确地计算,但它太慢了..

反正有没有提高这一点?

Spa*_*man 14

我想你需要阅读文档foreach.您的代码块应该计算单个部分,然后您应该使用该.combine选项来说明如何将它们连接在一起.请查看示例中的help(foreach)更多指导.它不是for循环的直接替代品.

例如:

> resultdf = foreach(i=1:10,.combine=rbind)%dopar%{data.frame(x=runif(4),i=i)}
> resultdf
            x  i
1  0.23794248  1
2  0.15536320  1
3  0.58609635  1
4  0.98780497  1
5  0.97806482  2
6  0.92440741  2
7  0.13416121  2
8  0.81598340  2
9  0.13834423  3
[etc]
Run Code Online (Sandbox Code Playgroud)


小智 5

您需要修改您的“foreach 循环”,例如:

newdf = foreach(ind=1:1000, .combine=rbind) %dopar%
{
    testdf$X = sample(testdf$X,nrow(testdf), replace=FALSE)
    fit = lm(X ~ Y, testdf)
    data.frame(pc=ind, err=sum(residuals(fit)^2) )
}
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!