2017-07-17 8 views
2

DataFrame/matrixの各セルに関数を適用することは可能ですか?マルチスレッドで R?データフレームまたはマルチスレッドの各セルにRを適用する

x <- cbind(x1 = 3, x2 = c(4:1, 2:5)) 

cave <- function(x, c1, c2) { 
    a = 1000 
    for (i in 1:100) { # Useless busy work 
    b=matrix(runif(a*a), nrow = a, ncol=a) 
    } 
    c1 + c2 * x  
} 

apply(x, 1, cave, c1 = 3, c2 = 4) 

リターン::私は(適用)しかし、ネイティブマルチスレッド許可していないように意識してい

代わり

[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] 
x1 15 15 15 15 15 15 15 15 
x2 19 15 11 7 11 15 19 23 

は、私は、複数のコアを使用したいです適用される機能が複雑になる可能性があるため、操作を実行する。たとえば、1つはapply a function to each cell in DataFrame multithreadedly in pandasです。

+1

パラレルパッケージからmcmapplyをチェックしましたか? –

+2

mcmapplyはWindowsシステムでは動作しません。 –

答えて

2

おそらくこれを行うにはいくつかの方法がありますが、リストオブジェクトに対して並列操作を実行するのが最も簡単です。

## convert the input object to a list 
x.list <- split(t(x), rep(1:nrow(x), each = ncol(x))) 

## parallelize the operation over e.g. 2 cores 
cl <- parallel::makeCluster(2) 
out <- parallel::parLapply(cl, x.list, cave, c1 = 3, c2 = 4) 
parallel::stopCluster(cl) 

## transform the output list back to a matrix 
out <- t(matrix(unlist(out, use.names = FALSE), nrow = ncol(x))) 
colnames(out) <- colnames(x) 

これはプラットフォームにまたがって動作するはずです:あなたがリストに入力行列を変換する場合は、次のように関数が並列:: parLapplyを使用して適用することができます。

> x 
    x1 x2 
[1,] 3 4 
[2,] 3 3 
[3,] 3 2 
[4,] 3 1 
[5,] 3 2 
[6,] 3 3 
[7,] 3 4 
[8,] 3 5 
> out 
    x1 x2 
[1,] 15 19 
[2,] 15 15 
[3,] 15 11 
[4,] 15 7 
[5,] 15 11 
[6,] 15 15 
[7,] 15 19 
[8,] 15 23 
関連する問題