r - 从稀疏矩阵到数据框
问题描述
我在 R 中有一个大小为 12 000 X 12 000 的邻接稀疏矩阵 M,我想将它转移到另一个软件。我必须将其转换为 3 列 data.frame,其中 col1 是我的矩阵的 col 的名称,col2 是我的矩阵行的名称,而 col3 是值 M[i,j]。如果 M[i,j] 不为 0(保持稀疏矩阵的逻辑),我只想在 data.frame 中创建一个条目。
我已经看到很多问题询问如何做相反的动作,所以我想这并不复杂,但我找不到如何有效地做到这一点。
谢谢你的帮助
解决方案
首先,我假设您有一个通过 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)
推荐阅读
- java - 在 JDBC 中使用 unnest(array[someArray]) 发送三个数组的异常
- angular - 如何在 angular2-markdown 的降价中包含降价
- ios - 如何从传输对象的列表类型中获取数据?(RealmSwift)
- python-3.x - 根据每行中的字符串对数据进行分类
- asp.net-mvc - 更改引导程序时导航栏无法正确显示
- javascript - 如何从 firebase 检索和显示与特定用户配置文件相关的数据
- php - 我正在尝试更新一个表并从不同的表中调用另一行
- mysql - 使用另一个表记录更新一个表
- c# - .NET 异步关闭方法?
- opentracing - 使用 Jaeger 跟踪 Java 应用程序时出错