2016-10-31 85 views
0

我有一個函數需要循環兩個參數。據我所知,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

如果你感到快樂轉換矩陣轉置到數據幀,有許多的很好的選擇。因此,與以下幾點入手:

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)) 

注意,使用的t()移調是因爲你的例子涉及了行操作。你的「更復雜」的功能可能不需要這個。

然後,一些選項基於mapply(),或幾個map*函數來自purrr包。實例...

使用鹼mapply(),它接受一個函數和多個輸入來迭代:

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

使用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()它需要多個輸入的列表。在這裏,我將添加第三個數據幀(再次)以演示更一般的示例:

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,])) 
相關問題