2016-10-31 49 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,])) 
相关问题