我的代码中有一个 foreach 循环,以减少运行时间。我面临的问题是,我没有得到输出中的所有输入记录。以下是代码段。
# my_df has 100 records
library(doMC)
library(foreach)
no_cores <- detectCores()
registerDoMC(no_cores)
# nrow(my_df)=100
output <- foreach(combo = 1:nrow(my_df),.combine=rbind) %dopar%
{
df <- my_df[combo,] #taking 1 row at a time
### do some operations ####
score <- sum(another_df$score1+another_df$score2)
if(score>score_cutoff){
df$score <- score
}else{
df$score <- 0}
df; #rbinding *df* to *output*
}
输出数据框应包含100条记录,但我得到一个随机数的记录(每次少于100条记录)。我多次使用 foreach ,但这是第一次发生这种情况。
有人可以帮我解决这个问题吗? 提前谢谢。
答案 0 :(得分:0)
因此,foreach
对你的索引i
进行并列化。在您的情况下,这将是您的数据行my_df
。
您执行的每项计算都将成为使用output
绑定在一起的列表rbind
的元素。到目前为止一切都很好。
我无法确切地说你是如何得出结果的,但通常我认为在foreach
循环中分配这么多变量是个好主意。
这就是我如何解决它,结果看起来没问题(有100行):
library(doParallel)
no_cores <- detectCores()
cl <- makeCluster(no_cores)
registerDoParallel(cl)
# simulate your data
set.seed(42)
my_df <- data.frame(A=sample(1:1000,100),B=sample(1:1000,100))
cutoff <- 500
output <- foreach(i = 1:nrow(my_df),.combine=rbind) %dopar%
{
data.frame(A=my_df$A[i],B=my_df$B[i],Score=ifelse(my_df$A[i]+my_df$B[i] > cutoff,my_df$A[i]+my_df$B[i],0))
}
stopCluster(cl)