2016-11-11 2 views
-1

I foreach Paket parallel die for-Schleife verwenden möchten: siehtwie bei der Parallelverarbeitung gemeinsam genutzten Datenrahmen verwenden foreach Verwendung

der ursprüngliche Code wie:

data_df=data.frame(...) # the data frame where original data stored 
result_df=data.frame(...) # the data frame where result data to be stored 

for(i in 1:10) 
{ 
    a=data_df[i,]$a 
    b=data_df[i,]$b 
    sum_result=a+b 
    sub_result=a-b 
    result_df[i,]$sum_result=sum_result 
    result_df[i,]$sub_result=sub_result 
} 

I Index i als Zeilennummer verwendet , um Daten aus dem Datenrahmen zu erhalten und Daten in einen anderen Datenrahmen zu speichern.

Wenn ich jedoch ändern:

for(i in 1:10) 

zu

foreach(i=1:10) %dopar% 

Es läuft super schnell, aber das Ergebnis scheint nur in einer Spalte in dem Datenrahmen gespeichert. Wie kann ich zwei Spalten zusammen speichern?

Wie soll ich den gemeinsamen Datenrahmen schreiben, um parallel zu sein?

Beispieldaten für data_df

a b 
1 1 
2 4 
4 8 
9 6 
2 3 
+0

Parallelisierung erhält jeder Kindprozess eine neue Umgebung. Also müssen Sie am Ende den data.frame zurückgeben, so dass jede Kindprozessausgabe durch den Elternprozess zusammen gespeichert werden kann –

+0

Fügen Sie auch ein Beispieldatenbeispiel hinzu, an dem wir arbeiten können! –

+0

danke für das Hinzeigen, ich habe hinzugefügt, dass – lserlohn

Antwort

1

Sie .combine = rbind

result = foreach(i = 1:5, .combine = rbind) %dopar% { 
    data.frame(x = runif(40), i = i) 
} 

> head(result) 
      x i 
1 0.2777559 1 
2 0.2126995 1 
3 0.2847905 1 
4 0.8950941 1 
5 0.4462353 1 
6 0.7799849 1 
+0

Ich überarbeitete meine Frage, konnten Sie helfen, zu beantworten, wie man einen Datenrahmen mit sequenzieller Zuweisung von Werten – lserlohn

1

Sie können dies tun, verwenden sollten:

require("doParallel") 
require("foreach") 
registerDoParallel(cores=detectCores()) 
n <- nrow(data_df) 
res <- foreach(i=1:n, .combine=rbind) %dopar% { 
    data_df[i,]$a + data_df[i,]$b 
} 

data_df 

    # a b 
# 1 1 6 
# 2 2 7 
# 3 3 8 
# 4 4 9 
# 5 5 10 

res 
     # [,1] 
# result.1 7 
# result.2 9 
# result.3 11 
# result.4 13 
# result.5 15 

Daten

data_df <- structure(list(a = 1:5, b = 6:10), .Names = c("a", "b"), row.names = c(NA, 
-5L), class = "data.frame") 
+0

zurückgibt Danke, nach sorgfältiger Prüfung des Codes, fand ich mein Problem ist, wie man zwei Spalten ergibt, resultiere in einem Datenrahmen. Könnten Sie sich bitte den neuen Code ansehen? Vielen Dank. – lserlohn

Verwandte Themen