Quickly unite multiple sparse matrices in R

By Kevin Leiss

The matrices need to have col- and rownames.

merge.sparse <- function(...) {
 
  cnnew <- character()
  rnnew <- character()
  x <- vector()
  i <- numeric()
  j <- numeric()
 
  icount <- 1
  for (M in list(...)) {
    cat("Merged", icount, "matrices\n")
    cnold <- colnames(M)
    rnold <- rownames(M)
 
    cnnew <- union(cnnew,cnold)
    rnnew <- union(rnnew,rnold)
 
    cindnew <- match(cnold,cnnew)
    rindnew <- match(rnold,rnnew)
    ind <- unname(which(M != 0,arr.ind=T))
    i <- c(i,rindnew[ind[,1]])
    j <- c(j,cindnew[ind[,2]])
    x <- c(x,M@x)
 
    icount <- icount +1
 
  }
 
  sparseMatrix(i=i,j=j,x=x,dims=c(length(rnnew),length(cnnew)),dimnames=list(rnnew,cnnew))
}