使用 R 中的应用系列并行化用户定义的函数

Parallelize user-defined function using apply family in R

我有一个脚本计算时间太长,我正在尝试并行化它的执行。

该脚本基本上遍历数据框的每一行并执行一些计算,如下所示:

my.df = data.frame(id=1:9,value=11:19)

sumPrevious <- function(df,df.id){
    sum(df[df$id<=df.id,"value"])
}

for(i in 1:nrow(my.df)){
    print(sumPrevious(my.df,my.df[i,"id"]))
}

我开始学习在 R 中并行化代码,这就是为什么我首先想了解如何使用类似应用的函数(例如 sapply、lapply、mapply)来执行此操作的原因。

我试过很多东西,但到目前为止没有任何效果:

mapply(sumPrevious,my.df,my.df$id) # Error in df$id : $ operator is invalid for atomic vectors

使用 R 中的 parallel 包,您可以使用 mclapply() 函数。您需要稍微调整一下代码,使其 运行 并行。

library(parallel)
my.df = data.frame(id=1:9,value=11:19)

sumPrevious <- function(i,df){df.id = df$id[i]
    sum(df[df$id<=df.id,"value"])
}

mclapply(X = 1:nrow(my.df),FUN = sumPrevious,my.df,mc.preschedule = T,mc.cores = no.of.cores)

此代码将 运行 sumPrevious 在您的机器上 no.of.cores 并行。

嗯,玩起来很有趣。你需要像下面这样的东西:

 mapply(sumPrevious,list(my.df),my.df$id)

对于供应,由于第一个输入是数据框,您必须定义一个给定的函数才能识别它,因此:

  sapply(my.df$id,function(x,y) sumPrevious(y,x),my.df)

我在这里更喜欢mapply,因为我们可以将第一个值直接设置为dataframe。但是整个数据框。这就是您必须使用函数 list 的原因。

Mapmapply 的包装器,因此只会以列表格式呈现解决方案。尝试一下。此外 lapplysapply 相似,只是 sapply 必须将结果简化为数组格式,而 lapply 将给出与列表相同的结果。

尽管看起来无论您尝试做什么都可以通过 cumsum 函数简单地完成。

 cumsum(df$values)