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)
任何建议都非常受欢迎!
我有一个大的稀疏矩阵(“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很好地利用了该包的功能。同一行代码也应该适用于其他稀疏矩阵类。我的直接进入内部存储,因此不同的类别需要不同的版本。