2013-02-11 17 views
6

並列処理を使用してデータフレームに値を追加する際に問題があります。foreachパッケージを使用してデータフレームに行を追加します

私は何らかの計算を行い、データフレームを返す関数を持っています。これらの計算はランダムサンプリングです。

ので、私がやったことです:私はresdfの結果を表示するとき、それは私が%do%%dopar%を交換する場合、結果が正しく計算されますが、それはあまりにも遅いです

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) 

だ...

これを少しでも引き上げるにはどうにかしていますか?

+1

'foreach'と' dopar'がどこから来たのかを思い出させてください。そしてあなたの 'mydf'も - あなたの問題を再現することができます。 – Spacedman

+0

mydfはランダムなデータフレームです。foreachはパッケージで、 'library(foreach)'と 'library(doMC)'、 'registerDoMC()'を追加してください。 – ifreak

答えて

11

foreachのドキュメントを読む必要があると思います。コードブロックは1つの部分を計算する必要があります。次に、.combineオプションを使用して、それらをすべて一緒に結合する方法を指定する必要があります。詳細については、help(foreach)の例をご覧ください。それはforループのためのまっすぐの置き換えではありません。例えば

:あなたのようなあなたの 'foreachループ' を変更する必要があり

> 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

+0

その値は 'foreach'によって返されます - 編集を見てください – Spacedman

3

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

はそれが役に立てば幸い!

関連する問題