2016-10-31 9 views
0

私は循環する必要がある2つのパラメータを持つ関数を持っています。私が知る限り、apply()は、ディメンションインジケータとともに1つの配列パラメータにしか適用できません。とにかく、2つの配列パラメーターに適用することはありますか?ここでは一例です:あなたは行列は転置データフレームに変換する満足している場合は適用する2つのパラメータを持つ関数に対してApply()を適用します

matrix_a <- matrix(1:6,3,2) 
matrix_b <- matrix(2:7,3,2) 


fun1 <- function(par1,par2){ 
    mean(par1+par2) #true function are more complex than this 
} 

result <- numeric(nrow(matrix_a)) 

#this for loop give me exactly what I want, however, is there any sophistical way to do this? Like use a apply() function 
for(i in 1:nrow(matrix_a)){ 
    result[i] <- fun1(matrix_a[i,], matrix_b[i,]) 
} 

答えて

0

、素敵な多くのオプションがあります。したがって、次で始まる:あなたの例では、行方向の操作を伴うためt()の使用が移調すること

matrix_a <- matrix(1:6,3,2) 
matrix_b <- matrix(2:7,3,2) 

df_a <- data.frame(t(matrix_a)) 
df_b <- data.frame(t(matrix_b)) 

注意です。あなたの "より複雑な"機能はこれを必要としないかもしれません。

次に、いくつかのオプションは、ベースmapply()、またはpurrrパッケージのmap*の機能です。例...

反復処理する機能を受け付けるベースmapply()、及び複数の入力を使用した:

mapply(function(i, j) mean(i + j), df_a, df_b) 
#> X1 X2 X3 
#> 6 8 10 

を反復処理するために2つの入力をとりpurrr MAP2を使用:

library(purrr) 
map2(df_a, df_b, ~ mean(.x + .y))  # returns list 
#> $X1 
#> [1] 6 
#> 
#> $X2 
#> [1] 8 
#> 
#> $X3 
#> [1] 10 

map2_dbl(df_a, df_b, ~ mean(.x + .y)) # returns numeric vector 
#> X1 X2 X3 
#> 6 8 10 

使用purrr pmap()は、複数の入力のリストを取ります。ここでは、より一般的な例を示すために、3番目のデータフレームをもう一度追加します(

pmap_dbl(list(df_a, df_b, df_b), ~ mean(sum(.))) 
#> X1 X2 X3 
#> 7 9 11 
1

一つの方法

sapply(1:nrow(matrix_a), function(i) fun1(matrix_a[i,], matrix_b[i,])) 
関連する問題