首页 > 解决方案 > 从稀疏矩阵到数据框

问题描述

我在 R 中有一个大小为 12 000 X 12 000 的邻接稀疏矩阵 M,我想将它转移到另一个软件。我必须将其转换为 3 列 data.frame,其中 col1 是我的矩阵的 col 的名称,col2 是我的矩阵行的名称,而 col3 是值 M[i,j]。如果 M[i,j] 不为 0(保持稀疏矩阵的逻辑),我只想在 data.frame 中创建一个条目。

我已经看到很多问题询问如何做相反的动作,所以我想这并不复杂,但我找不到如何有效地做到这一点。

谢谢你的帮助

标签: rdataframematrixsparse-matrix

解决方案


首先,我假设您有一个通过 Matrix 包创建的常规稀疏矩阵。也就是说,非零条目根据它们的值、列和行偏移量进行编码。

Matrix 包将稀疏矩阵表示为一组三元组,其中非零值根据它们的坐标进行编码。这基本上就是你想要的。事实证明,转换为这种形式很容易;然后你可以把它变成一个数据框。

一个缺点是坐标是从零开始的(即第一行中的元素被编码为 row 0),您可能希望也可能不希望将其转换为从零开始。

library(Matrix)
# some sample data
m <- rsparsematrix(12000, 12000, 1e-7)

# convert to triplet form
mm <- as(m, "dgTMatrix")

# convert to data frame: convert to 1-based indexing
data.frame(i=mm@i + 1, j=mm@j + 1, x=mm@x)

#       i     j     x
#1    144   624  0.16
#2   3898  1106 -1.80
#3  11444  1395  0.89
#4   3981  2300  0.27
#5   3772  3602 -0.42
#6   2674  4058  0.79
#7   4446  4943  0.58
#8   4550  6629  0.82
#9   4125  6867 -0.86
#10  3151  7865 -0.42
#11 11590  8019 -0.96
#12  4808  9428 -1.30
#13 10453 11141  0.39
#14 11112 11592 -1.40

如果您想要行/列名称而不是数字:

data.frame(i=rownames(mm)[mm@i + 1], j=colnames(mm)[mm@j + 1], x=mm@x)

推荐阅读