2012-05-11 34 views
20

Tengo una matriz regular (no dispersa) que me gustaría convertir a sparseMatrix (usando el paquete Matrix). ¿Hay una función para hacer esto o necesito hacer un montón de bucles?R convertir matriz o marco de datos a sparseMatrix

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 

¿Alguna sugerencia?

+4

sugerencia de menor importancia para la toma de datos de la muestra: 'regMat [cbind (c (3,2,8,1,7), c (5,8,4,6 , 4))] <- round (runif (5,0,100)) ' – Aaron

Respuesta

30

Aquí hay dos opciones:

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,] . . . . . . . . . . 
+5

también' Matrix (regMat, sparse = TRUE) ' – Aaron

+0

Gracias @Aaron. No sabía acerca de ese modismo, pero lo he agregado a la respuesta como una segunda opción. –

Cuestiones relacionadas