[R] how to divide each element of a matrix by a specific value per column
Marc Schwartz
marc_schwartz at me.com
Thu Jan 27 16:44:11 CET 2011
On Jan 27, 2011, at 9:18 AM, adam_pgsql wrote:
>
> Hi,
>
> I'd like to divide each element of a matrix by a specific value per column. These specific values are stored in a list. For example:
>
>> x <- c(1,2,3,4,5)
>> y <- matrix(c(1:30), nrow = 6)
>
> Now I want to divide each element in y[,1] by x[1], y[,2] by x[2] etc. I have tried this
>
>> my_function <- function(data, ind) data/ind
>> apply(y, 2, my_function, x)
> [,1] [,2] [,3] [,4] [,5]
> [1,] 1 7.0 13.0 19.0 25.0
> [2,] 1 4.0 7.0 10.0 13.0
> [3,] 1 3.0 5.0 7.0 9.0
> [4,] 1 2.5 4.0 5.5 7.0
> [5,] 1 2.2 3.4 4.6 5.8
> [6,] 6 12.0 18.0 24.0 30.0
> Warning messages:
> 1: In data/ind :
> longer object length is not a multiple of shorter object length
> 2: In data/ind :
> longer object length is not a multiple of shorter object length
> 3: In data/ind :
> longer object length is not a multiple of shorter object length
> 4: In data/ind :
> longer object length is not a multiple of shorter object length
> 5: In data/ind :
> longer object length is not a multiple of shorter object length
>
> but as you can see it is applying them by row rather than column. Any ideas how to do this? Is there a variable within 'apply' that can be used to determine which column of y is being processed?
>
> thanks for any help
>
> adam
Here is one approach:
> t(t(y) / x)
[,1] [,2] [,3] [,4] [,5]
[1,] 1 3.5 4.333333 4.75 5.0
[2,] 2 4.0 4.666667 5.00 5.2
[3,] 3 4.5 5.000000 5.25 5.4
[4,] 4 5.0 5.333333 5.50 5.6
[5,] 5 5.5 5.666667 5.75 5.8
[6,] 6 6.0 6.000000 6.00 6.0
You essentially transpose the 'y' matrix so that the normal vector cycling of 'x' is applied properly, then transpose the result back to the original orientation.
HTH,
Marc Schwartz
More information about the R-help
mailing list