On Mon, 2009-07-13 at 09:06 +0000, Tom Liptrot wrote: > Hi, > > I have a matrix: > > mymat <- matrix(runif(10*4), ncol=4) > > I wish to subtract the column means, down the colums, subtract the row > means from the rows and add back the grand mean - all the means should > be the means of mymat rather than of the new matrix. > > How can I do this? > > Any help much appreciated.
See ?sweep as one way to remove a set of statistics from a matrix. To compute the statistics to sweep, you should look at ?rowMeans and ?colMeans, plus ?mean (for the overall mean of the matrix). The function below encapsulates the various steps that will do the manipulation for you. I've added a conversion for the input object if it is a data frame as mean() works differently on a matrix compared to a df. (Your actual data is more likely to be in a data frame than a matrix initially.) set.seed(1) mymat <- matrix(runif(10*4), ncol=4) grandMean <- function(m) { if((df <- is.data.frame(m))) m <- data.matrix(m) rm <- rowMeans(m) cm <- colMeans(m) gm <- mean(m) m <- sweep(m, 1, rm, "-") # 1 means from the rows m <- sweep(m, 2, cm, "-") # 2 means from the cols m <- m + gm # here we treat m as a vector if(df) # return to a data.frame if one originally m <- as.data.frame(m) return(m) } grandMean(mymat) grandMean(as.data.frame(mymat)) HTH G > > Thanks > > Tom -- %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~% Dr. Gavin Simpson [t] +44 (0)20 7679 0522 ECRC, UCL Geography, [f] +44 (0)20 7679 0565 Pearson Building, [e] gavin.simpsonATNOSPAMucl.ac.uk Gower Street, London [w] http://www.ucl.ac.uk/~ucfagls/ UK. WC1E 6BT. [w] http://www.freshwaters.org.uk %~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~%~% ______________________________________________ R-help@r-project.org mailing list https://stat.ethz.ch/mailman/listinfo/r-help PLEASE do read the posting guide http://www.R-project.org/posting-guide.html and provide commented, minimal, self-contained, reproducible code.