有没有 `data.table` 的稀疏矩阵/对象表示法?

5

我希望能够在 data.table 框架中工作,其中有许多原因并未在此文章中提及。 data.table 是否具有指标矩阵的稀疏表示形式,类似于 Matrix 包?

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(which(matrix(ints, ncol=1000)==1, arr.ind = TRUE)) 是另一种表示方式,相对较小(可能只是因为我扔掉了 m 中看到的 @x 部分)。以这种方式存储,您将无法访问所有与 dgCMatrix 对象兼容的 Matrix 函数,因此可能不值得这样做。 - Frank
1个回答

2

正如@Frank在评论中提到的,您可以通过以三元组形式存储非零元素及其索引来高效地在data.table中表示稀疏矩阵:

m2 <- as(m, "dgTMatrix")
dt2 <- data.table(i=m2@i+1, j=m2@j+1, value=m2@x)

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接