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

MCS*_*MCS 4 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])
Run Code Online (Sandbox Code Playgroud)

任何建议都非常受欢迎!

李哲源*_*李哲源 5

我有一个大的稀疏矩阵(“dgCMatrix”)

我们就这样称呼它吧dgCMat

我需要计算每列有多少个非零值

xx <- diff(dgCMat@p)
Run Code Online (Sandbox Code Playgroud)

并创建一个只有 1 个非零条目的列名列表

colnames(dgCMat)[xx == 1]
Run Code Online (Sandbox Code Playgroud)

概括

nnz:非零数

对于“dgCMatrix” dgCMat

## nnz per column
diff(dgCMat@p)

## nnz per row
tabulate(dgCMat@i + 1)
Run Code Online (Sandbox Code Playgroud)

对于“dgRMatrix” dgRMat

## nnz per column
tabulate(dgRMat@j + 1)

## nnz per row
diff(dgRMat@p)
Run Code Online (Sandbox Code Playgroud)

对于“dgTMatrix” dgTMat

## nnz per column
tabulate(dgTMat@j + 1)

## nnz per row
tabulate(dgTMat@i + 1)
Run Code Online (Sandbox Code Playgroud)

发布此答案时我没有阅读您的原始代码。所以我不知道你被困在使用mat == 0. mat == 0直到后来我才在你的答案中添加了和之间的区别mat != 0

您的解决方法mat != 0很好地利用了该包的功能。同一行代码也应该适用于其他稀疏矩阵类。我的直接进入内部存储,因此不同的类别需要不同的版本。