Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using "apply" to apply a function to a matrix where parameters are column-specific

Tags:

r

apply

I'm trying to avoid using loops by using apply to apply a user-defined function to a matrix. The problem I have is that there are additional parameters that my function uses and they differ for each column of the matrix. Below is a toy example.

Say I have the following function:

foo <- function(x, a, b, c) return( (a*x + b)^c )

and I want to apply it to a matrix bar using different values of a, b, and c for each column.

bar <- matrix(1:15, ncol = 3)
a <- 4:6
b <- 3:1
c <- 1:3

In this case, for the first column of bar, then a=4, b=3, and c=1. I tried this,

apply(bar, 2, foo, a=a, b=b, c=c)

but this is clearly incorrect, as each column uses all parameters sequentially before wrapping back to the first parameter again. Any suggestions?

like image 500
Lyngbakr Avatar asked May 15 '15 17:05

Lyngbakr


1 Answers

We could split the 'bar' by 'column' (col(bar)) and with mapply we can apply 'foo' for the corresponding 'a', 'b', 'c' values to each column of 'bar'

mapply(foo, split(bar, col(bar)), a, b, c)

Or without using apply

ind <- col(bar)
(a[ind]*bar +b[ind])^c[ind]
like image 107
akrun Avatar answered Nov 01 '22 12:11

akrun