2017-04-04 17 views
0

我想在data.table框架中工作,因爲這篇文章中沒有包含各種原因。 data.table對指標矩陣ala 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(其(矩陣(整數,NcoI位= 1000)== 1,arr.ind = TRUE))'是另一表示,有點小(可能只是因爲我扔ou在'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.table也可以從dt構造:

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