使用foreach包将行附加到dataframe

时间:2013-02-11 15:56:59

标签: r foreach parallel-processing

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

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

所以我做的是:

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)

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

如果我将%dopar%替换为%do%,则结果会正确计算,但速度太慢..

无论如何都要提高一点吗?

2 个答案:

答案 0 :(得分:13)

我认为您需要阅读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]

答案 1 :(得分:4)

你需要修改你的foreach循环&#39;如:

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) )
}

希望它有所帮助!