如何使用foreach在并行处理中使用共享数据帧
我想使用foreach包来并行for循环: 原始代码如下所示:如何使用foreach在并行处理中使用共享数据帧,r,parallel-foreach,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=
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)
到
它确实运行得非常快,但结果似乎只存储在数据帧中的一列中。如何将两列保存在一起
我应该如何编写共享数据帧,以便并行
数据_df的示例数据
a b
1 1
2 4
4 8
9 6
2 3
您应该使用
.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
您可以这样做:
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
require(“双平行”)
要求(“foreach”)
registerDoParallel(核心=检测核心()
n在并行化中,每个子进程获得一个新的环境。因此,最后您需要返回data.frame,以便父进程可以将每个子进程的输出存储在一起。还需要添加一个示例数据示例供我们使用!谢谢你指出,我补充道that@lserlohn我能回答你的问题吗?如果没有,请加上。谢谢大家。我发现我的问题更复杂。如何将两列保存在一起?如果我使用rbind选项,我只能保存一个。谢谢,在仔细检查代码之后,我发现我的问题是如何在一个数据帧中输出两列结果。你能看一下新的密码吗?谢谢。我修改了我的问题,你能帮我回答一下如何返回带有顺序赋值的数据帧吗
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")