簡體   English   中英

在R中使用Apply系列並行化用戶定義的函數

[英]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中並行化代碼,這就是為什么我首先想了解如何使用類似於app的函數(例如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,因為我們可以直接將第一個值設置為數據幀。 但是整個數據幀。 這就是為什么必須使用功能list

Mapmapply的包裝,因此只能以列表格式顯示解決方案。 試試吧。 lapply類似於sapplysapply將不得不結果簡化成陣列形式而lapply將給出相同的結果的列表。

盡管看起來您想做的任何事情都可以簡單地通過cumsum函數完成。

 cumsum(df$values)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM