2013-02-11 17 views
6

Ho riscontrato un problema con l'aggiunta di valori a un frame di dati utilizzando l'elaborazione parallela.aggiungi righe al dataframe utilizzando il pacchetto foreach

Ho una funzione che eseguirà alcuni calcoli e restituirà un dataframe, inclusi questi calcoli è un campionamento casuale.

così quello che ho fatto è:

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) 

quando osservo il risultato di resdf, è vuota

se sostituisco %dopar% con %do% il risultato viene calcolato correttamente, ma è troppo lento ..

c'è comunque per dare un po 'di spinta ??

+1

ci ricorda da dove provengono 'foreach' e' dopar'. E anche il tuo 'mydf' - così possiamo riprodurre il tuo problema. – Spacedman

+0

mydf è solo un dataframe casuale, e foreach è un pacchetto e dovresti aggiungere 'library (foreach)' e 'library (doMC)', 'registerDoMC()' – ifreak

risposta

11

Penso che sia necessario leggere i documenti per foreach. Il tuo blocco di codice dovrebbe calcolare una singola parte, quindi dovresti usare l'opzione .combine per dire come unirli tutti insieme. Guarda gli esempi nel numero help(foreach) per maggiori informazioni. Non è un sostituto diretto per un ciclo for.

Ad esempio:

> 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, grazie per la risposta, ma come posso tornare il risultato df e usarlo da qualche altra parte ?? è appena stampato sullo stdou .. – ifreak

+0

il suo valore restituito da 'foreach' - vedi modifica – Spacedman

3

È necessario modificare il 'ciclo foreach' come ad esempio:

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

Speranza che aiuta!

Problemi correlati