R:doParallel foreach具有多个数据帧输出

时间:2018-05-07 11:36:36

标签: r parallel-processing

我有一个需要操作三个数据帧的函数,它们都具有不同的结构:

  • a:原始数据框。这是我的功能的参数。在某些条件下,我需要从这里删除行。
  • b:在我的函数中创建的新数据框。我的函数在这里添加了所有行。
  • c:在我的函数中创建的另一个新数据框。我的函数在这里添加了所有行。

为了尝试并行处理,我设置了一个最小的代码(this questionthis blog之后),我只生成了b

# Set up the parallel
registerDoParallel( makeCluster(3L) )

b <- foreach(i = 1:nrow(f), .combine = rbind) %dopar% {
  tempB <- do_something_function()

  tempB
}

该示例工作正常,但我缺少两个数据帧。我找到了其他答案,但我相信我的情况有所不同:

我可以将a更改为稍后会删除的行的数据框,但我需要将所有tempAtempA合并...如果这有任何意义。在我之前提到的问题中,它们混合了所有输出。

2 个答案:

答案 0 :(得分:0)

到目前为止我找到了这个解决方案。我没有从a中删除,而是创建了一个将被删除的行的数据框。我写了一个合并函数:

combine <- function(x, ...) {  
  mapply(rbind, x, ..., SIMPLIFY = FALSE)
}

我的循环是这样的:

# Set up the parallel
registerDoParallel( makeCluster(3L) )

# Loop
output <- foreach(i = 1:nrow(f), .combine = combine, .multicombine = TRUE) %dopar% {
  tempA <- get_this_value()
  tempB <- do_something_function()
  tempC <- get_this_other_frame()

  # Return the values
  list(tempA, tempB, tempC)
}

然后,我使用output[[1]]等访问数据。但是,对于此解决方案,我仍然需要在循环后执行setdiffanti_join,以删除&#34;不期望的&#34;来自a的行。

答案 1 :(得分:0)

似乎您的问题与并行性无关,而是与结果相结合。

我将如何解决问题的一个例子(我认为这是最有效的方法):

library(foreach)
tmp <- foreach(i = seq_len(32)) %do% {
  list(iris[i, ], mtcars[i, ], iris[i, ])
}

lapply(purrr::transpose(tmp), function(l) do.call(rbind, l))