如何在R中返回并行处理的表列表
Posted
技术标签:
【中文标题】如何在R中返回并行处理的表列表【英文标题】:how to return a list of tables parallel processing in R 【发布时间】:2015-07-02 17:42:27 【问题描述】:我正在尝试了解如何通过并行循环返回包含四个表的列表。目前,我有一个函数calculatef1(k,i)
,它返回一个由四个元素组成的向量c(score1,score2,score3,score4)
。
aggregate_scores <-
foreach(k = 1:num_metrics, .combine='cbind') %:%
foreach(i = 1:10, .combine='c') %dopar%
x = c("boot","dtw","sqldf")
lapply(x, require, character.only=T)
f1 <- NA
try(f1<-calculatef1(k,i),silent=TRUE)
f1
现在,这个并行循环返回一个包含 40 行和 num_metrics
列的表,但是我将如何更改我的 foreach 循环,所以我返回一个包含 4 个表的列表,每个表对应一个不同的分数,而不是(或至少类似的东西)?
谢谢!
*为了重现性,将其用于calculatef1函数...
calculatef1 <- function(k,i)
score1 <- k+i
score2 <- k-i
score3 <- k*i
score4 <- k^i
c(score1,score2,score3,score4)
我想返回一个包含四个数据帧的列表,例如,第 3 个数据帧的以下对 k,i 的得分为 3。
1*1=1 2*1=2 3*1=3 ...
1*2=2 2*2=4 3*2=6 ...
1*3=3 2*3=6 3*3=9 ...
. . .
. . .
同样,第 4 个数据帧将有 1^1、2^1、3^1、1^2、2^2 等。你明白了。
【问题讨论】:
最好能提供一个可重现的例子。 刚刚添加了一些更多的东西以实现可重复性。 导入这些库的目的是什么?我假设它们与真正的calculatef1 有关。此外,您还应该提供所需的输出。表应该包括什么?因为据我所见,第一个循环输出一维数组 忽略这些库。我在这里更改了我的 calculatef1 代码以避免显示公司数据。 【参考方案1】:当然,诀窍是创建适当的组合函数。您可以将来自内部foreach
循环的向量与rbind
组合起来,这样它就会返回矩阵,然后由外部foreach
循环处理这些矩阵。外部foreach
循环的组合可以是:
comb <- function(x, ...)
lapply(1:4, function(i) c(x[[i]], lapply(list(...), function(y) y[,i])))
这会返回一个包含四个列表的列表,可以使用“final”函数将其转换为包含四个数据框的列表:
final <- function(x)
lapply(x, function(y)
attr(y, 'names') <- paste('X', seq_along(y), sep='.')
attr(y, 'row.names') <- .set_row_names(length(y[[1]]))
class(y) <- 'data.frame'
y
)
您可以使用以下方法测试这两个函数:
x <- list(list(), list(), list(), list())
x <- comb(x, matrix(1, 10, 4), matrix(2, 10, 4))
x <- comb(x, matrix(3, 10, 4), matrix(4, 10, 4))
print(final(x))
最后,您可以在实际的foreach
循环中测试它们:
x <- list(list(), list(), list(), list())
aggregate_scores <-
foreach(k = 1:6, .init=x, .final=final,
.combine=comb, .multicombine=TRUE) %:%
foreach(i = 1:10, .combine='rbind') %dopar%
c(k+i, k-i, k*i, k^i)
【讨论】:
以上是关于如何在R中返回并行处理的表列表的主要内容,如果未能解决你的问题,请参考以下文章