2013-06-28 21 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中のパッケージを使用し、最終的にwrite.matrix.csr()とフォーマットをLIBSVMするために、この行列を保存する:現在、私は次のコードを使用していますが、それは非常に正常に動作し、秒かかり

最初に私のスパース行列を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パッケージから疎行列で始まるのをみましょう。SparseMの両方の列と行指向のフォーマットをサポートし、容易に扱うことができる機能を有しているMatrixパッケージは、列指向の圧縮フォーマットを使用

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

あるフォーマットから他のフォーマットへの変換。

だから我々は最初の列指向SparseM行列の中に私たちの列指向Matrixを変換します:私たちはちょうど右のコンストラクタを呼び出し、両方のパッケージは、(0または1で開始)の指標ごとに異なる規則を使用することに気付いて注意する必要があります。

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

これで、2つの行列が同じであることを確認できます。迅速な回答ありがとうございます。 –

関連する問題