我有一个函数,它需要循环两个参数。据我所知,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 :(得分: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