2016-11-11 15 views
-1

使用在并行处理共享数据帧我想使用的foreach包并行for循环:如何使用的foreach

原始的代码如下所示:

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 
+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