[R] pairwise difference operator

From: Adaikalavan Ramasamy <ramasamy_at_cancer.org.uk>
Date: Sat 31 Jul 2004 - 09:30:52 EST


There was a BioConductor thread today where the poster wanted to find pairwise difference between columns of a matrix. I suggested the slow solution below, hoping that someone might suggest a faster and/or more elegant solution, but no other response.

I tried unsuccessfully with the apply() family. Searching the mailing list was not very fruitful either. The closest I got to was a cryptic chunk of code in pairwise.table().

Since I do use something similar myself occasionally, I am hoping someone from the R-help list can suggest alternatives or past threads. Thank you.

### Code ###

pairwise.difference <- function(m){

  npairs  <- choose( ncol(m), 2 )
  results <- matrix( NA, nc=npairs, nr=nrow(m) )
  cnames  <- rep(NA, npairs)

  if(is.null(colnames(m))) colnames(m) <- paste("col", 1:ncol(m), sep="")   

  k <- 1
  for(i in 1:ncol(m)){
    for(j in 1:ncol(m)){

      if(j <= i) next;
      results[ ,k] <- m[ ,i] - m[ ,j]
      cnames[k]    <- paste(colnames(m)[ c(i, j) ], collapse=".vs.")
      k <- k + 1

    }
  }   

  colnames(results) <- cnames
  rownames(results) <- rownames(m)
  return(results)
}

### Example using a matrix with 5 gene/row and 4 columns ###
mat <- matrix( sample(1:20), nc=4 )
colnames(mat) <- LETTERS[1:4]; rownames(mat) <- paste( "g", 1:5, sep="") mat

    A B C D
g1 10 16 3 15
g2 18 5 12 19
g3 7 4 8 13
g4 14 2 6 11
g5 17 1 20 9

pairwise.difference(mat)

   A.vs.B A.vs.C A.vs.D B.vs.C B.vs.D C.vs.D

g1     -6      7     -5     13      1    -12
g2     13      6     -1     -7    -14     -7
g3      3     -1     -6     -4     -9     -5
g4     12      8      3     -4     -9     -5
g5     16     -3      8    -19     -8     11

Regards,

-- 
Adaikalavan Ramasamy                    ramasamy@cancer.org.uk
Centre for Statistics in Medicine       http://www.ihs.ox.ac.uk/csm/
Cancer Research UK                      Tel : 01865 226 677
Old Road Campus, Headington, Oxford     Fax : 01865 226 962

______________________________________________
R-help@stat.math.ethz.ch mailing list
https://www.stat.math.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html
Received on Sat Jul 31 09:37:35 2004

This archive was generated by hypermail 2.1.8 : Fri 18 Mar 2005 - 02:41:28 EST