我有一个需要操作三个数据帧的函数,它们都具有不同的结构:
a
:原始数据框。这是我的功能的参数。在某些条件下,我需要从这里删除行。b
:在我的函数中创建的新数据框。我的函数在这里添加了所有行。c
:在我的函数中创建的另一个新数据框。我的函数在这里添加了所有行。为了尝试并行处理,我设置了一个最小的代码(this question和this blog之后),我只生成了b
:
# Set up the parallel
registerDoParallel( makeCluster(3L) )
b <- foreach(i = 1:nrow(f), .combine = rbind) %dopar% {
tempB <- do_something_function()
tempB
}
该示例工作正常,但我缺少两个数据帧。我找到了其他答案,但我相信我的情况有所不同:
我可以将a
更改为稍后会删除的行的数据框,但我需要将所有tempA
与tempA
合并...如果这有任何意义。在我之前提到的问题中,它们混合了所有输出。
答案 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]]
等访问数据。但是,对于此解决方案,我仍然需要在循环后执行setdiff
或anti_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))