如何在使用foreach的并行处理中使用共享数据帧

时间:2016-11-11 08:16:46

标签: r parallel-foreach

我想使用foreach包来并行for循环:

原始代码如下:

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
}

我使用index i作为行号,从数据帧中获取数据并将数据存储回另一个数据帧。

但是,如果我改变:

for(i in 1:10)

foreach( i=1:10) %dopar% 

它运行得非常快,但结果似乎只存储在数据框的一列中。如何将两列保存在一起?

我应该如何编写共享数据帧,以便并行?

data_df的样本数据

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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")