-1

我想使用 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
}

我使用索引 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
4

2 回答 2

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
于 2016-11-11T08:58:56.990 回答
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")
于 2016-11-11T09:50:02.927 回答