我有一个大的稀疏矩阵(“ dgCMatrix”,尺寸5e + 5 x 1e + 6)。我需要为每列计数有多少个非零值,并创建仅包含1个非零条目的列名列表。
我的代码适用于小型矩阵,但是对于我需要处理的实际矩阵而言,计算量太大了。
library(Matrix)
set.seed(0)
mat <- Matrix(matrix(rbinom(200, 1, 0.10), ncol = 20))
colnames(mat) <- letters[1:20]
entries <- colnames(mat[, nrow(mat) - colSums(mat == 0) == 1])
任何建议都非常欢迎!
答案 0 :(得分:2)
使用以下方法产生相似的结果: 请注意提供的评论:
## `mat != 0` returns a "lgCMatrix" which is sparse
## don't try `mat == 0` as that is dense, simply because there are too many zeros
entries <- colnames(mat)[colSums(mat != 0) == 1]
答案 1 :(得分:1)
我有一个大的稀疏矩阵(“ dgCMatrix”)
让我们称之为dgCMat
。
我需要为每一列计算多少个非零值
xx <- diff(dgCMat@p)
并列出仅包含1个非零条目的列名称
colnames(dgCMat)[xx == 1]
摘要
nnz:非零数字
对于“ dgCMatrix” dgCMat
:
## nnz per column
diff(dgCMat@p)
## nnz per row
tabulate(dgCMat@i + 1)
对于“ dgRMatrix” dgRMat
:
## nnz per column
tabulate(dgRMat@j + 1)
## nnz per row
diff(dgRMat@p)
对于“ dgTMatrix” dgTMat
:
## nnz per column
tabulate(dgTMat@j + 1)
## nnz per row
tabulate(dgTMat@i + 1)
发布此答案时,我没有阅读您的原始代码。因此,我不知道您对mat == 0
的使用感到困惑。直到后来,我才在您的答案中加入mat == 0
和mat != 0
之间的区别。
您使用mat != 0
的变通办法可以很好地利用软件包的功能。相同的代码行也应与其他稀疏矩阵类一起使用。我的直接进入内部存储,因此不同的类需要不同的版本。