R package Matrix:获取稀疏矩阵每行/每列的非零条目数

时间:2018-07-27 14:47:31

标签: r matrix sparse-matrix

我有一个大的稀疏矩阵(“ 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])

任何建议都非常欢迎!

2 个答案:

答案 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 == 0mat != 0之间的区别。

您使用mat != 0的变通办法可以很好地利用软件包的功能。相同的代码行也应与其他稀疏矩阵类一起使用。我的直接进入内部存储,因此不同的类需要不同的版本。