2016-11-11 9 views
-1

Я хочу использовать Еогеасп пакет параллельно для цикла:как использовать совместно dataframe в параллельной обработке с использованием Еогеаспа

исходного код выглядит следующим образом:

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 
} 

Я использовал индекс г, как номер строки , чтобы получить данные из фрейма данных и сохранить данные обратно в другой фрейм данных.

Однако, если я изменю:

for(i in 1:10) 

в

foreach(i=1:10) %dopar% 

Это действительно бежит очень быстро, но результат кажется хранится только в одном столбце в кадре данных. Как сохранить два столбца вместе?

Как написать общий кадр данных, чтобы быть параллельным?

выборки данных для data_df

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

В параллелизации каждый дочерний процесс получает новую среду. Поэтому в конце вам нужно вернуть data.frame, чтобы каждый дочерний процесс мог быть сохранен вместе родительским процессом –

+0

также добавить пример данных для нас, над которыми мы работаем! –

+0

спасибо за указание, я добавил, что – lserlohn

ответ

1

вы должны использовать .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

Я пересмотрел свой вопрос, не могли бы вы ответить, как вернуть кадр данных с последовательным присваиванием значений. – lserlohn

1

Вы можете сделать это:

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 

данные

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

Спасибо, внимательно изучив код, я обнаружил, что моя проблема заключается в том, как вывод двух столбцов приводит к кадру данных. Не могли бы вы взглянуть на новый код? Благодарю. – lserlohn