2017-04-04 2 views
0

data.tableフレームワークでこの記事には含まれていないさまざまな理由で作業したいと思います。 data.tableは、標識マトリクスのための疎な表現を持っていますか?Matrixパッケージですか?スパース行列/オブジェクトの `data.table`表現はありますか?

library(Matrix) 
library(data.table) 

set.seed(123409L) 

ints <- sample.int(2L, 1e6, replace=T, prob= c(0.9, 0.1)) - 1 

m <- Matrix(ints, ncol= 1000) 
dt <- data.table(matrix(ints, ncol= 1000)) 

pryr::object_size(m) # 1.22 MB 
pryr::object_size(dt) # 8.1 MB 

私は成長が仮に無制限である6e8要素に近い有する実際のユースケースで想定します。

この質問には既に回答済みの場合は事前にお詫びしてください。私はそれが重複としてフラグを立てることができてうれしいです。しかし、私は検索で重複を見つけられませんでした。

+1

さて、 'MDT = as.data.table((マトリックス(int型、NcoI部位= 1000)== 1、arr.ind = TRUE))'別の表現であります、いくぶん小さい(おそらく私はouを投げているからだtは 'm 'に見られる' @ x'部分)。そのようにしておくと、dgCMatrixオブジェクトでうまくいくように設計されたすべてのMatrix関数にアクセスすることができなくなるため、価値がないかもしれません。 – Frank

答えて

0

@Frankが彼のコメントで示唆したように、あなたはトリプレットの形で、すなわち、個々の観測など、それぞれのインデックスと一緒に非ゼロ要素を格納することによってdata.tableで効率的にスパース行列を表すことができますが:

m2 <- as(m, "dgTMatrix") 
dt2 <- data.table([email protected]+1, [email protected]+1, [email protected]) 

pryr::object_size(dt2) # 1.62 MB 

このdata.tabledtから構築することができる。

dt2 <- melt(copy(dt)[,i:=.I], id.vars="i" 
    )[value>0][,j:=as.integer(variable)][,variable:=NULL] 
関連する問題