2013-06-28 282 views
13

我在R中有一個因子矩陣,並希望將它轉換爲虛擬變量矩陣0-1,以表示每個因子的所有可能級別。R:稀疏矩陣轉換

然而,這個「虛擬」矩陣非常大(91690x16593)並且非常稀疏。我需要將它存儲在一個稀疏矩陣中,否則它不適合我的12GB內存。

目前,我使用下面的代碼,它工作得很好,只需要幾秒鐘:

library(Matrix) 
X_factors <- data.frame(lapply(my_matrix, as.factor)) 
#encode factor data in a sparse matrix 
X <- sparse.model.matrix(~.-1, data = X_factors) 

不過,我想用在R上的e1071包,並最終拯救這個矩陣LIBSVM格式write.matrix.csr() ,所以首先我需要將我的稀疏矩陣轉換爲格式的SparseM格式。

我試圖做的:

library(SparseM) 
X2 <- as.matrix.csr(X) 

,但它很快就填滿了我的RAM,並最終[R崩潰。我懷疑在內部,as.matrix.csr首先將稀疏矩陣轉換爲不適合我的計算機內存的稠密矩陣。

我的另一種選擇是直接用SparseM格式創建我的稀疏矩陣。我試過as.matrix.csr(X_factors)但它不接受一個數據幀的因素。

SparseM軟件包中是否有相當於sparse.model.matrix(~.-1, data = X_factors)?我在文檔中搜索,但我沒有找到。

回答

18

非常棘手,但我想我明白了。

讓我們從Matrix包的稀疏矩陣開始:

i <- c(1,3:8) 
j <- c(2,9,6:10) 
x <- 7 * (1:7) 
X <- sparseMatrix(i, j, x = x) 

Matrix包使用面向列的壓縮格式,而SparseM支持列和行導向的格式,並且具有功能,可以很容易地處理的從一種格式轉換到另一種格式。

所以我們會先轉換成我們的Matrix成面向列的SparseM矩陣面向列的:我們只是需要小心調用合適的構造函數,並注意到這兩個軟件包使用不同的約定指數(在01開始):

X.csc <- new("matrix.csc", ra = [email protected], 
          ja = [email protected] + 1L, 
          ia = [email protected] + 1L, 
          dimension = [email protected]) 

然後,到面向列的面向行的格式變化:

X.csr <- as.matrix.csr(X.csc) 

大功告成!你可以通過這樣做檢查兩個矩陣是否相同(在我的小例子中):

​​
+0

它的工作完美。感謝您的快速回答。 –