是否有一种简单的方法可以通过R中的并行化一次运行多个循环试验?



我有一个代码,它是一系列嵌套的for循环。外部for循环遍历10个整数以生成一个数据帧。整数是完全互斥的,但是代码相当慢。我想知道是否有可能,通过并行化,同时运行几个循环。我对foreach很感兴趣,但是在一系列嵌套的for循环之后,combine功能似乎不适合生成数据帧。我对每一个人的选择都是正确的吗,还是有更好的选择?

这是我的代码的一个精选版本。最后一行是循环的输出。

foreach(tra=lowageband:highageband) %do% {      
ptptdata <- fresh.data
cols <- c('FinalSalary', 'FinalDCBalance', 'FinalSSLow', 'FinalSSHigh')
trials <- 1:numtrials
##[LOTS OF VECTORIZATION REDACTED]## 
#START LIFE CYCLE LOOP# <- This exact code is repeated a few times   
for(trial in 1:numtrials){
[CODE REDACTED]
for(row in 1:countlc) {
[CODE REDACTED]
for (i in 1:dur){
[CODE REDACTED]
}
[CODE REDACTED]
}
[CODE REDACTED]
new_cols <- c(outer(cols, trial, paste, sep = '_'))
ptptdatalc[new_cols] <- ptptdatalc[cols]
}

final.model.data <- rbind(ptptdatalc,ptptdata_overretage)       
assign(paste0("ModelDataAt",tra),final.model.data) 
}

使用foreach作为基础的doParallel包可以做到这一点。这实际上取决于你如何构建你的数据和输出它,以便你可以将它组合回数据框架。

library(doParallel)
registerDoParallel(detectCores())
trial_results <- foreach(tra=lowageband:highageband) %dopar% {      
ptptdata <- fresh.data
cols <- c('FinalSalary', 'FinalDCBalance', 'FinalSSLow', 'FinalSSHigh')
trials <- 1:numtrials
##[LOTS OF VECTORIZATION REDACTED]## 
#START LIFE CYCLE LOOP# <- This exact code is repeated a few times   
for(trial in 1:numtrials){
[CODE REDACTED]
for(row in 1:countlc) {
[CODE REDACTED]
for (i in 1:dur){
[CODE REDACTED]
}
[CODE REDACTED]
}
[CODE REDACTED]
new_cols <- c(outer(cols, trial, paste, sep = '_'))
ptptdatalc[new_cols] <- ptptdatalc[cols]
}

final.model.data <- rbind(ptptdatalc,ptptdata_overretage)       
list(name = paste0("ModelDataAt_",tra), model_data = final.model.data)
}

一旦你完成了,你可以结合它们取决于你想如何从purrr结合bind_rowspluck函数

library(purrr)
combined_data <- bind_rows(map(trial_results, .f = pluck, "model_data"))

如果你想过滤结果,你可以使用keep:

filtered_list <- keep(trial_results,
.p = function(x) { x$name == "ModelDataAt_ABC" })
# Then combind just like previously
filtered_combine_data <- bind_rows(map(filtered_list, .f = pluck, "model_data"))

相关内容

  • 没有找到相关文章

最新更新