从一个大的稀疏R矩阵中选择非零值

3

我在R中有一个非常大的稀疏矩阵。对于指定的行,我想只获取相应列中的非零值(通常是10000个值中的5-10个)。使用查看选项时,只能可视化一个非常小的矩阵子集(我想超出了内存限制)。当我使用A[1,]来获取A的第一行时,我遇到了同样的问题。我想得到一个向量,其中只包含列索引和相应的值,当我指定矩阵的特定行时,其值高于零。有没有聪明的方法来做到这一点?


which(A[i,]!>0)会告诉你第i行中数值大于0的列的位置。 - R18
谢谢,它有效果了。如果去掉 "!",否则我会遇到错误。是否有一种聪明的方法将列和矩阵条目的合并值一起提取出来,而不是逐个调用它们? - Crusader
如果您的矩阵是稀疏的,应使用稀疏矩阵来存储它;这种结构会自动存储非零项的列和行索引。很容易通过子集操作获取大于0的项。 - user2957945
1
@Crusader; 示例数据:m = matrix(sample(0:3, 100, prob=c(10,1,1, 1), replace=TRUE), 10)。转换为稀疏矩阵 library(Matrix) ; m2 = as(m, "TsparseMatrix")。查看对象 str(m2)。你可以提取列(j) m2@j+1。由于稀疏矩阵的索引从零开始,所以需要加一。值存储在 x 中。 m2@x。[顺便说一句:抱歉,我没有看到你的消息-如果你在消息中添加 @username(即@user2957945),用户会收到通知] - user2957945
1
@user2957945,谢谢,非常有用 :-) - Crusader
显示剩余2条评论
1个回答

1
假设您有一个稀疏的dgCMatrix,并且用户选择的行存储在变量'rowIndx'中,以下代码将创建所有非零值的索引,然后从中选择感兴趣的用户选择行。
rowIndx <- 2
mm <- Matrix::Matrix(matrix(rbinom(2e4, 1, 0.10), ncol = 100))

创建非零元素的索引
colN <- diff(mm@p) #get the number of non-zero elements in each column
indx <- cbind(mm@i+1,rep(seq_along(colN),colN)) #create the indices of all non-zero elements

获取所需的列索引和值

indx[which(indx[,1]==rowIndx),2] #vector of non-zero column indices
mm[rowIndx,indx[which(indx[,1]==rowIndx),2]] #vector of non-zero values

使用此方法创建索引比使用“which”命令快三倍

indx <- which(mm!=0,arr.ind = T)

对于含有 2e8 元素的大型 dgCMatrix 的方法。


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