Apply() 用于具有两个要应用的参数的函数

Apply() for a function with two parameters to apply over

我有一个函数有两个需要循环的参数。据我所知,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,])
}

一种方法

sapply(1:nrow(matrix_a), function(i) fun1(matrix_a[i,], matrix_b[i,]))

如果您乐于将矩阵转换为转置数据帧,则有许多不错的选择。所以从以下开始:

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()转置是因为您的示例涉及按行操作。您的 "more complex" 函数可能不需要这个。

然后,一些选项是 purrr 包中的基础 mapply() 或少数 map* 函数。示例...

使用 base 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() 获取多个输入的列表。在这里,我将添加第三个数据框(又是 b)来演示一个更通用的示例:

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