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

时间:2016-10-31 21:45:47

标签: r list apply

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

2 个答案:

答案 0 :(得分:1)

一种方法

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

答案 1 :(得分: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()进行转置是因为您的示例涉及行方向操作。你的更复杂&#34;功能可能不需要这个。

然后,一些选项是基础mapply(),或者来自purrr包的少数map*个函数。实例...

使用基数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