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

Vic*_*tor 4 parallel-processing r lapply sapply mapply

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

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

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"]))
}
Run Code Online (Sandbox Code Playgroud)

我开始学习在 R 中并行化代码,这就是为什么我首先想了解如何使用类似 apply 的函数(例如 sapply、lapply、mapply)来做到这一点。

我尝试了多种方法,但到目前为止没有任何效果:

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

tus*_*haR 5

使用parallelR 中的包,您可以使用该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)
Run Code Online (Sandbox Code Playgroud)

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

  • 惊人的!多谢 :) (2认同)