2013-02-11 17 views
6

我在使用並行處理將值附加到數據框時遇到問題。使用foreach包將行附加到數據框

我有一個函數,會做一些計算並返回一個數據幀,包括這些計算是一個隨機抽樣。

所以我所做的是:

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的結果,它是空的

如果我%do%取代%dopar%結果被正確地計算,但它太慢了..

有無論如何推動這一點?

+1

提醒我們'foreach'和'dopar'來自哪裏。而且你的'mydf'也是 - 所以我們可以重現你的問題。 – Spacedman 2013-02-11 16:09:55

+0

mydf只是一個隨機數據框,而foreach是一個包,你應該添加'library(foreach)'和'library(doMC)','registerDoMC()' – ifreak 2013-02-11 16:37:23

回答

11

我認爲你需要閱讀文檔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] 
+0

好的,謝謝你的回答,但是我該如何返回導致的DF,並在別的地方使用它?它只是被打印到stdou .. – ifreak 2013-02-11 16:35:17

+0

其由'foreach'返回的值 - 請參閱編輯 – Spacedman 2013-02-11 16:41:02

3

您需要修改 '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)) 
} 

希望它能幫助!