2013-02-11 22 views
6

Mam problem z dołączaniem wartości do ramki danych przy użyciu przetwarzania równoległego.dołączanie wierszy do ramki danych za pomocą pakietu foreach

Mam funkcję, która wykona pewne obliczenia i zwróci ramkę danych, w tym obliczenia te są losowymi próbkami.

więc co zrobiłem to:

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) 

kiedy zobaczyć wynik resdf, to pusty

jeśli mogę zastąpić %dopar% z %do% wynik jest obliczany poprawnie, ale to jest zbyt powolny ..

czy jest jakiś sposób, aby to nieco poprawić?

+1

przypomnij nam, skąd pochodzą "foreach" i "dopar". I twój 'mydf' też - abyśmy mogli odtworzyć twój problem. – Spacedman

+0

mydf jest po prostu losową ramką danych, a foreach jest pakietem i powinieneś dodać 'library (foreach)' i 'library (doMC)', 'registerDoMC()' – ifreak

Odpowiedz

11

Myślę, że musisz przeczytać dokumentację dla foreach. Twój blok kodu powinien obliczyć pojedynczą część, następnie powinieneś użyć opcji .combine, aby powiedzieć, jak połączyć je wszystkie razem. Spójrz na przykłady w help(foreach), aby uzyskać więcej wskazówek. Nie jest prostym zamiennikiem pętli for.

Na przykład:

> 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

ok, dziękuję za odpowiedź, ale jak mogę zwrócić? wynikowy df i użyć go gdzieś indziej? jest po prostu drukowany na stdou .. – ifreak

+0

jego wartość zwrócona przez 'foreach' - patrz edycja – Spacedman

3

Trzeba zmodyfikować 'pętli foreach' takich jak:

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

Nadzieję, że to pomaga!

Powiązane problemy