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