web-dev-qa-db-ja.com

R行列またはデータフレームをsparseMatrixに変換

sparseMatrixパッケージを使用して)Matrixに変換したい通常のマトリックス(非スパース)があります。これを行う関数はありますか、それとも一連のループを実行する必要がありますか?

例.

> 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

助言がありますか?

31
screechOwl

2つのオプションがあります。

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,] . . .  .  .  . .  . . .
49
Josh O'Brien

マトリックスについては、誰かがすでに答えを持っています。

Data.tableには、ジョブを実行したパッケージがあります。

library(Matrix)
library(mltools)
x = data.table()
sparseM <- sparsify(x) 
0
cloudscomputes

ジョシュの答えは結構ですが、より多くのオプションと説明があります。

Nit Picky "私は通常の行列(非スパース)を持っています..."実際にあなたは do 疎なマトリックス(ほとんど0s);圧縮されていない形式です。あなたの目標は、それを圧縮ストレージ形式にすることです。

スパース行列は、複数のストレージ形式に圧縮できます。 圧縮スパース列(CSC) および 圧縮スパース行(CSR) は、2つの主要な形式です。 as(regMat, "sparseMatrix")は、マトリックスをdgCMatrixタイプの圧縮スパース列に変換します。これは通常あなたが望んでいることですが、私はそれについて明示することを好みます。

_library(Matrix)

matCSC <- as(regMat, "dgCMatrix")  # compressed sparse column CSC
matCSC
10 x 10 sparse Matrix of class "dgCMatrix"

 [1,] . . .  .  . 57 .  . . .
 [2,] . . .  .  .  . . 27 . .
 [3,] . . .  . 90  . .  . . .
 [4,] . . .  .  .  . .  . . .
 [5,] . . .  .  .  . .  . . .
 [6,] . . .  .  .  . .  . . .
 [7,] . . . 91  .  . .  . . .
 [8,] . . . 37  .  . .  . . .
 [9,] . . .  .  .  . .  . . .
[10,] . . .  .  .  . .  . . .

matCSR <- as(regMat, "dgRMatrix")  # compressed sparse row CSR
matCSR
10 x 10 sparse Matrix of class "dgRMatrix"

 [1,] . . .  .  . 57 .  . . .
 [2,] . . .  .  .  . . 27 . .
 [3,] . . .  . 90  . .  . . .
 [4,] . . .  .  .  . .  . . .
 [5,] . . .  .  .  . .  . . .
 [6,] . . .  .  .  . .  . . .
 [7,] . . . 91  .  . .  . . .
 [8,] . . . 37  .  . .  . . .
 [9,] . . .  .  .  . .  . . .
[10,] . . .  .  .  . .  . . .
_

これらは表面上は外観や動作は同じですが、内部的にはデータの格納方法が異なります。データの列を取得する場合はCSCが高速で、行を取得する場合はCSRが高速です。また、データの構造に応じて、使用するスペースの量も異なります。

さらに、この例では、圧縮されていないスパース行列を圧縮された行列に変換しています。通常、これはメモリを節約するために行うので、圧縮されていないマトリックスを構築して、それを圧縮形式に変換するだけでは目的を達成できません。実際には、(行、列、値)トリプレットのテーブルから圧縮スパース行列を作成するのがより一般的です。これは、MatrixのsparseMatrix()関数を使用して行うことができます。

_# Make data.frame of (row, column, value) triplets
df <- data.frame(
  rowIdx = c(3,2,8,1,7),
  colIdx = c(5,8,4,6,4),
  val = round(runif(n = 5), 2) * 100
)

df
  rowIdx colIdx val
1      3      5  90
2      2      8  27
3      8      4  37
4      1      6  57
5      7      4  91

# Build CSC matrix
matSparse <- sparseMatrix(
  i = df$rowIdx,
  j = df$colIdx, 
  x = df$val, 
  dims = c(10, 10)
)

matSparse
10 x 10 sparse Matrix of class "dgCMatrix"

 [1,] . . .  .  . 57 .  . . .
 [2,] . . .  .  .  . . 27 . .
 [3,] . . .  . 90  . .  . . .
 [4,] . . .  .  .  . .  . . .
 [5,] . . .  .  .  . .  . . .
 [6,] . . .  .  .  . .  . . .
 [7,] . . . 91  .  . .  . . .
 [8,] . . . 37  .  . .  . . .
 [9,] . . .  .  .  . .  . . .
[10,] . . .  .  .  . .  . . .
_

恥知らずなプラグイン-興味があれば このことをカバーするブログ記事 などがあります。

0
Ben