2016-11-11 2 views
-1

Je veux utiliser paquet foreach parallèle à la boucle:comment utiliser dataframe partagé dans le traitement parallèle en utilisant foreach

le code original ressemble à:

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 
} 

je index i comme le numéro de ligne , pour obtenir des données à partir d'une trame de données et stocker des données dans une autre trame de données.

Cependant, si je change:

for(i in 1:10) 

à

foreach(i=1:10) %dopar% 

Il ne fonctionne super rapide, mais le résultat semble que stocké dans une colonne dans la trame de données. Comment puis-je sauvegarder deux colonnes ensemble?

Comment écrire la trame de données partagée, pour être mise en parallèle?

données d'échantillon pour data_df

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

En parallélisation, chaque processus enfant obtient un nouvel environnement. Donc, à la fin, vous devez retourner le fichier data.frame afin que chaque sortie du processus enfant puisse être stockée par le processus parent. –

+0

ajoutez également un exemple de données pour que nous puissions travailler dessus! –

+0

merci de souligner, j'ai ajouté que – lserlohn

Répondre

1

vous devez utiliser .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

J'ai révisé ma question, pourriez-vous aider à répondre comment retourner une trame de données avec attribution séquentielle des valeurs – lserlohn

1

Vous pouvez le faire:

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 

données

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

Merci, après avoir examiné attentivement le code, j'ai trouvé mon problème est de savoir comment sortir deux colonnes résultat dans une trame de données. Pourriez-vous s'il vous plaît jeter un oeil sur le nouveau code? Merci. – lserlohn