我有一个脚本,计算时间太长,而且我试图将其执行并行化。
脚本基本上循环遍历数据框的每一行并执行一些计算,如下所示:
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
答案 0 :(得分:3)
使用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)
此代码将在您计算机的no.of.cores
上并行运行sumPrevious。
答案 1 :(得分:1)
嗯,这很有趣。你需要的东西如下:
mapply(sumPrevious,list(my.df),my.df$id)
对于供应,由于第一个输入是数据帧,因此您必须定义一个给定的函数才能识别它:
sapply(my.df$id,function(x,y) sumPrevious(y,x),my.df)
我更喜欢mapply,因为我们可以将第一个值设置为直接作为数据帧。但整个数据帧。这就是你必须使用函数list
的原因。
Map
我是mapply
的包装器,因此只会以列表格式呈现解决方案。试试吧。此外,lapply
与sapply
类似,只有sapply
必须将结果简化为数组格式,而lapply
会提供与列表相同的结果。
虽然看起来无论你想做什么都可以通过cumsum
函数完成。
cumsum(df$values)