まばらなデータの非常に大きなマトリックスがあるとしますが、そのサンプルを見て、さらにまばらにすることにのみ関心があるとします。行/列/データの値 (csv ファイルからインポート) の列を含むトリプルのデータフレームもあるとします。library(Matrix) の sparseMatrix() 関数を使用して、疎行列を作成できることを知っています
sparseMatrix(i=df$row,j=df$column,x=df$value)
ただし、私の値のために、数百万行×数万列のスパース行列になります (サブセットがほとんどの行と列を除外しているため、ほとんどは空です)。これらのゼロの行と列はすべて、私の関数の一部をゆがめてしまいます (たとえば、クラスタリングを考えてみましょう - 原点が有効な点でさえない場合、原点を含む 1 つのクラスターになります)。同じ操作を実行したいのですが、i と j を行名と列名として使用します。密なベクトルを作成し、最大サイズまでサンプリングして値を追加しようとしました
denseMatrix <- matrix(0,nrows,ncols,dimnames=c(df$row,df$column))
denseMatrix[as.character(df$row),as.character(df$column)]=df$value
(実際には、この場合の値に興味がないため、1に等しく設定しています)しかし、行列全体ではなく、すべての行と列のクロスを取るため、マトリックス全体を埋めていることがわかりましたrow1*col1、row2*col2... 私がやろうとしていることを達成する方法を知っている人はいますか? または、疎な行列を埋めて、ゼロの行と列をすべて破棄して、より密な形式に圧縮するだけでも問題ありません(ただし、元の行と列の番号への参照を維持したいと思います) ) 提案をいただければ幸いです。
次に例を示します。
> rows<-c(3,1,3,5)
> cols<-c(2,4,6,6)
> mtx<-sparseMatrix(i=rows,j=cols,x=1)
> mtx
5 x 6 sparse Matrix of class "dgCMatrix"
[1,] . . . 1 . .
[2,] . . . . . .
[3,] . 1 . . . 1
[4,] . . . . . .
[5,] . . . . . 1
行 2 と 4 だけでなく列 1、3、5 も削除したいと思います。次に、それらの間に空の行がさらに多くなります。名前付きの行/列を持つ密行列を使用するとどうなるか
> dmtx<-matrix(0,3,3,dimnames=list(c(1,3,5),c(2,4,6)))
> dmtx
2 4 6
1 0 0 0
3 0 0 0
5 0 0 0
> dmtx[as.character(rows),as.character(cols)]=1
> dmtx
2 4 6
1 1 1 1
3 1 1 1
5 1 1 1