khai wrote on 12/19/2011 11:26:55 PM: > Hi, > > I'm very new to working with sparse matrices and would like to know how I > can column permute a sparse matrix. Here is a small example: > > > M1 <- > > spMatrix(nrow=5,ncol=6,i=sample(5,15,replace=TRUE),j=sample(6, > 15,replace=TRUE),x=round_any(rnorm(15,2),0.001)) > > M1 > 5 x 6 sparse Matrix of class "dgTMatrix" > > [1,] 2.983 . 1.656 5.003 . . > [2,] . . 2.990 . . . > [3,] . 0.592 5.349 1.115 . . > [4,] 1.836 . 2.804 . . . > [5,] . 6.961 . . . 1.077 > > I know I can permute entire columns this way > > > M1[,sample(6,6)] > 5 x 6 sparse Matrix of class "dgTMatrix" > > [1,] 5.003 . . . 1.656 2.983 > [2,] . . . . 2.990 . > [3,] 1.115 0.592 . . 5.349 . > [4,] . . . . 2.804 1.836 > [5,] . 6.961 1.077 . . . > > But I would like the new sparse matrix to look like this...where only the > nonzero elements are permuted. > > [1,] 1.656 . 5.003 2.983 . . > [2,] . . 2.990 . . . > [3,] . 5.349 1.115 0.592 . . > [4,] 2.804 . 1.836 . . . > [5,] . 1.077 . . . 6.961 > > Thanks in advance for any advice!
I don't have experience with sparse matrices, but I was able to get this to work by converting the sparse matrix to a "base" matrix and back again. library(Matrix) nonzero.cols <- !apply(M1==0, 2, all) M2 <- as.matrix(M1) reord <- sample(seq(dim(M1)[2])[nonzero.cols]) M2[, nonzero.cols] <- as.matrix(M1[, reord]) Matrix(M2, sparse=TRUE) Jean [[alternative HTML version deleted]] ______________________________________________ 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.