David Lee - 1 year ago 106

R Question

I have a function which have two parameters needed to be cycled. As far as I know,

`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,])

}

Answer Source

If you're happy convert the matrices to transposed data frames, there are a number of nice options. So start with the following:

```
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))
```

Note that use of `t()`

to transpose is because your example involves rowwise operations. Your "more complex" function may not need this.

Then, some options are base `mapply()`

, or few `map*`

functions from the purrr package. Examples...

Using base `mapply()`

, which accepts a function and multiple inputs to iterate over:

```
mapply(function(i, j) mean(i + j), df_a, df_b)
#> X1 X2 X3
#> 6 8 10
```

Using purrr map2, which takes two inputs to iterate over:

```
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
```

Using purrr `pmap()`

which takes a list of multiple inputs. Here I'll add a third data frame (b again) to demonstrate a more general example:

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