Skip to content

How to apply a function on each column of a matrix

4 messages · anna, Jim Lemon, (Ted Harding)

#
Hello everyone, I get for each date a measure for n elements in the form of a
matrix. I am converting it to a ts object using ts(). I want to apply a
function on each column. I started using the apply function ( set to 2) but
what it returns is a matrix with the same columns representing the function
applied on the last column of the initial matrix. I have been trying to use
the sapply function or an apply in an apply but didn't get it to work the
way I wanted. Have anyone any idea about it?
#
Here is the last code that I wrote but it would give me the same problem:
I have the matrix mat with n columns mat.1, mat.2 ...mat.n

#To be able to use lapply I convert it to a data.frame: 
mat <- data.frame(mat)

lapply(mat, function, argument of function)

It works but I still get for all elements the function applied for the last
element. The elements of my results are all the same I don't understand I
did exactly as shown on this website: 
http://www.ats.ucla.edu/stat/r/library/advanced_function_r.htm#lapply
#
On 01/24/2010 11:11 AM, anna wrote:
Hi anna,
If you could post your matrix "mat" (or something else that produces the 
problem you describe if "mat" is private or too big) and the commands 
you used, someone will probably figure out what is going wrong.

Jim
#
On 24-Jan-10 00:27:37, Jim Lemon wrote:
I agree with Jim's comments. It may help to formulate your reply
to considet the following simple case of applying a function "on
each column of a matrix":

  X2 <- function(x){ x^2 }
  M <- matrix(c(1,2,3,4,5,6,7,8,9),nrow=3)
  M
  #      [,1] [,2] [,3]
  # [1,]    1    4    7
  # [2,]    2    5    8
  # [3,]    3    6    9

  X2 <- function(x){ x^2 }
  apply(M,2,X2)
  #      [,1] [,2] [,3]
  # [1,]    1   16   49
  # [2,]    4   25   64
  # [3,]    9   36   81

  SX2 <- function(x){ sum(x^2) }
  apply(M,2,SX2)
  # [1]  14  77 194

Not ythe use of apply(), not lapply(); also that the result is
not a matrix (with 1 row) but a vector (dimensionless):

  dim(apply(M,2,SX2))
  # NULL

If you want the result to be a 1-row vector, then you need to
force this explicitly:

  N <- apply(M,2,SX2)
  # dim(N)<-c(1,3)

  N
  #      [,1] [,2] [,3]
  # [1,]   14   77  194

or (in this case) more simply:

  rbind(NULL,apply(M,2,SX2))
  #      [,1] [,2] [,3]
  # [1,]   14   77  194

If that approach does not work with your matrix and your function,
then there must be something special about one or the other!
Ted.

--------------------------------------------------------------------
E-Mail: (Ted Harding) <Ted.Harding at manchester.ac.uk>
Fax-to-email: +44 (0)870 094 0861
Date: 24-Jan-10                                       Time: 00:49:12
------------------------------ XFMail ------------------------------