6

まばらなデータの非常に大きなマトリックスがあるとしますが、そのサンプルを見て、さらにまばらにすることにのみ関心があるとします。行/列/データの値 (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
4

4 に答える 4

4

特定の列/行を「取り除く」と言うとき、これはまさにこれを意味しますか?

> mtx[-c(2,4), -c(1,3,5)]
3 x 3 sparse Matrix of class "dgCMatrix"

[1,] . 1 .
[2,] 1 . 1
[3,] . . 1

サブセット化は機能するので、空の行と列を見つける方法が必要なだけですか? それが正しければ、colSums()andを使用できます。これらはMatrixrowSums()パッケージによって拡張されており、疎行列に適切なメソッドを使用できます。これにより、操作中にまばらさが維持されます

> dimnames(mtx) <- list(letters[1:5], LETTERS[1:6])
> mtx[which(rowSums(mtx) != 0), which(colSums(mtx) != 0)]
3 x 3 sparse Matrix of class "dgCMatrix"
  B D F
a . 1 .
c 1 . 1
e . . 1

または、おそらくより安全です

> mtx[rowSums(mtx) != 0, colSums(mtx) != 0]
3 x 3 sparse Matrix of class "dgCMatrix"
  B D F
a . 1 .
c 1 . 1
e . . 1
于 2011-08-23T17:49:45.717 に答える
1

最初の問題は、座標リスト (COO)の行インデックスと列インデックスの値が連続していないことに起因します。これに直面したとき、またはほとんどの疎行列を扱っているときでさえ、サポートによって行と列を並べ替える傾向があります。

これは、次の 2 つの方法で行うことができます。

  1. 疎行列と docolSumsおよびrowSumsoflogical(yourMatrix)を生成して、サポート値を取得するか、または
  2. tableまたはbigtabulate(スイートから) のような関数を使用bigmemoryして、座標リストで各値が発生した一意の回数を計算します。(私の好みはbigtabulateです。)

サポートが得られたら、rank関数 (実際にはrank(-1 * support, ties = "first")) を使用して、ランクに基づいて元のインデックスを新しいインデックスにマップできます。

この時点で、 を使用してマトリックスを作成するとsparseMatrix、すべての行と列がサポートされるような次元のマトリックスのみが生成されます。それより大きいものにはマップされません。

これは@GavinSimpsonのアプローチに似ていますが、彼の方法は欠落している行と列のみを削除しますが、私のアプローチは行列の左上隅に最大密度を配置するように並べ替え、行のインデックスを大きくすると密度が減少し、列。私のアプローチで元のインデックスに戻すには、「オリジナルからランク付け」と「ランク付けからオリジナル」というマッピングのペアを作成するだけで、必要に応じて元のデータを完全に再作成できます。

于 2011-08-23T19:55:52.193 に答える