将dgCMatrix转换为数据框

10
我想将一个稀疏矩阵转换为(row,column, value)类型的数据框。我已经发现了一些问题,如http://r.789695.n4.nabble.com/Converting-sparse-matrix-to-data-frame-in-Matrix-package-td2332012.html中的问题从(row,column,value)开始创建一个稀疏矩阵。 我想要相反的结果,而且我不能使用as.matrix函数,因为矩阵太大了。这里有一个小例子。
r = c(1,2,2,3,3)
c = c(4,1,2,3,5)
v = c(1,2,1,3,1)

a = sparseMatrix(i=r,j=c,x=v) 

3 x 5 sparse Matrix of class "dgCMatrix"

[1,] . . . 1 .
[2,] 2 1 . . .
[3,] . . 3 . 1

我能得到一个数据框吗?

  r c v
1 1 4 1
2 2 1 2
3 2 2 1
4 3 3 3
5 3 5 1

谢谢你


不是矩阵求逆,我指向的问题是从向量创建数据框架,然后创建密集矩阵。我想从稀疏矩阵开始,并获得(行、列、值)的数据框架。我想倒转他的问题,而不是倒转矩阵。 - HowYaDoing
哦,我明白了。不过,对于我来说,如何在不使用“as.matrix”的情况下使用通用的“matrix”方法(例如“MASS::ginv”)与“sparseMatrix”对象仍然是一个开放性问题。我以为你也在寻找类似的东西,但可悲的是,被接受的答案并没有解决这个问题。 - runr
1个回答

12

您可以使用

b = as.data.frame(summary(a))
#   i j x
# 1 2 1 2
# 2 2 2 1
# 3 3 3 3
# 4 1 4 1
# 5 3 5 1

如果您需要与示例中相同的顺序,可以使用:

b = b[order(b$i),]
#   i j x
# 4 1 4 1
# 1 2 1 2
# 2 2 2 1
# 3 3 3 3
# 5 3 5 1

另一个选择,虽然不那么整洁,是使用

b = as(a, "dgTMatrix")
cbind.data.frame(r = b@i + 1, c = b@j + 1, x = b@x)

2
这种方法是否比“as.matrix %>% as.data.frame”更便宜?(列名无关紧要) - runr
1
此外,在第一种情况下,“b%*%t(b)”会返回以下错误:“需要数字/复杂矩阵/向量参数”。我不知道我们如何避免在这里使用“as.matrix”。 - runr
@ Nutle,您的评论在这里并不适用。正如OP已经指出的那样,您似乎误认为问题是关于逆矩阵的 - 实际上并非如此。也许考虑删除您的评论,以防它们无意中会对其他读者产生误导? - dww
我将引用原帖中的确切话语:“我无法使用as.matrix函数,因为矩阵太大了。” - runr
最后,虽然有些用户可能会被误导,但其他人可能正在搜索“无法使用as.matrix函数”和“矩阵太大”的讨论。但如果您持不同意见,请说出来,我会删除我的评论。 - runr
是的,我认为这回答了OP提出的问题。如果您有关于不同主题的不同问题,应该将其作为新问题提出。这不是评论的目的。 - dww

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