Search code examples
rmatrixsparse-matrix

R convert matrix or data frame to sparseMatrix


I have a regular matrix (non-sparse) that I would like to convert to a sparseMatrix (using the Matrix package). Is there a function to do this or do I need to do a bunch of loops?

ex.

> regMat <- matrix(0, nrow=10, ncol=10)
> regMat[3,5] <- round(runif(1),2)*100
> regMat[2,8] <- round(runif(1),2)*100
> regMat[8,4] <- round(runif(1),2)*100
> regMat[1,6] <- round(runif(1),2)*100
> regMat[7,4] <- round(runif(1),2)*100
> regMat 
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]    0    0    0    0    0   49    0    0    0     0
 [2,]    0    0    0    0    0    0    0   93    0     0
 [3,]    0    0    0    0   20    0    0    0    0     0
 [4,]    0    0    0    0    0    0    0    0    0     0
 [5,]    0    0    0    0    0    0    0    0    0     0
 [6,]    0    0    0    0    0    0    0    0    0     0
 [7,]    0    0    0    8    0    0    0    0    0     0
 [8,]    0    0    0   14    0    0    0    0    0     0
 [9,]    0    0    0    0    0    0    0    0    0     0
[10,]    0    0    0    0    0    0    0    0    0     0

Any suggestions?


Solution

  • Here are two options:

    library(Matrix)
    
    A <- as(regMat, "sparseMatrix")       # see also `vignette("Intro2Matrix")`
    B <- Matrix(regMat, sparse = TRUE)    # Thanks to Aaron for pointing this out
    
    identical(A, B)
    # [1] TRUE
    A
    # 10 x 10 sparse Matrix of class "dgCMatrix"
    #                              
    #  [1,] . . .  .  . 45 .  . . .
    #  [2,] . . .  .  .  . . 59 . .
    #  [3,] . . .  . 95  . .  . . .
    #  [4,] . . .  .  .  . .  . . .
    #  [5,] . . .  .  .  . .  . . .
    #  [6,] . . .  .  .  . .  . . .
    #  [7,] . . . 23  .  . .  . . .
    #  [8,] . . . 63  .  . .  . . .
    #  [9,] . . .  .  .  . .  . . .
    # [10,] . . .  .  .  . .  . . .