2017-08-03 7 views
2

私は計算に時間がかかり、その実行をパラレル化しようとしているスクリプトを持っています。適用ファミリを使用してユーザ定義関数を並列化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のコードを並列化することを学ぶために始めていますどのように私は適用のような機能(例えば、サプリ、ラッピー、マッフル)でこれを行うことができます。

私は複数のものを試してみたが、何もこれまで働いた:

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

'lapply'、' sapply'、 'mapply'は並行して操作を行いません。それらは連続して機能を実行します。 'for loop'を' lapply'に置き換えたいのですか、あるいはあなたのコードを並列に実行したいのですか? – TUSHAr

+0

このために並列化が必要なのは奇妙に思えますか?あなたが達成しようとしているのは、 'my.df $ id'がソートされていると仮定すると、私のための' cumsum(my.df $ value) 'です。 –

答えて

3

あなたがmclapply()機能を使用することができますRにparallelパッケージを使用します。並列に実行するには、コードを少し調整する必要があります。

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

恐ろしい!どうもありがとう :) – Victor

1

これは楽しいです。最初の入力がデータフレームであることから、あなたはそれを認識エールするために与えられた関数を定義する必要がありますが、供給のための

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

:あなたは親切下記のようなものが必要

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

私は、データフレームとして直接帰属する最初の値を設定できるので、ここではmapplyを優先します。しかし、データフレーム全体。そのため、関数listを使用する必要があります。

Mapmapplyのラッパーであり、したがって、リスト形式の解決策を提示するに過ぎない。それを試してみてください。またlapplysapplyに似ていますが、sapplyは結果を配列形式に簡素化し、lapplyはリストと同じ結果を得ます。

あなたがしようとしているように見えますが、これは単にcumsum機能で行うことができます。

cumsum(df$values) 
関連する問題