2012-05-11 296 views
20

我有一个常规矩阵(非稀疏),我想将其转换为sparseMatrix(使用Matrix包)。有没有这样做的功能,或者我需要做一堆循环?R将矩阵或数据帧转换为稀疏矩阵

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 

有什么建议吗?

+4

,让你的样本数据未成年人的建议:'regMat [cbind(C(3,2,8,1,7),C(5,8,4,6 ,4))] < - round(runif(5,0,100))' – Aaron

回答

30

这里有两种选择:

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

也'矩阵(regMat,sparse = TRUE)' – Aaron

+0

谢谢@Aaron。作为第二种选择,我不知道这个成语,但已将它添加到答案中。 –