我有一个R大小为12 000 X 12000的邻接稀疏矩阵M,我想将其转移到另一个软件。我被迫将其转换为3列data.frame,其中col1是矩阵的col的名称,col2是矩阵的行的名称,col3的值是M [i,j]。如果M [i,j]不为0,我只想在data.frame中创建一个条目(保持稀疏矩阵的逻辑)。
我已经看到很多问题,询问如何采取相反的行动,所以我想这并不复杂,但是我找不到有效的方法。
感谢您的帮助
答案 0 :(得分:2)
首先,我将假定您具有通过Matrix包创建的常规稀疏矩阵。也就是说,非零条目会根据其值,列和行偏移进行编码。
Matrix程序包将稀疏矩阵表示为一组 triplet ,其中非零值根据其坐标进行编码。这基本上就是您想要的。事实证明,转换为这种形式很容易。然后可以将其转换为数据框。
一个缺点是,坐标是从零开始的(即,第一行中的元素被编码为行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)
答案 1 :(得分:0)
在内部,矩阵只是一个向量。您可以使用which
获取非零项目的向量索引,然后执行一些模块化算法来重建索引:
set.seed(123)
M <- matrix(sample(0:2,12,replace = TRUE,prob = c(0.8,0.1,0.1)),nrow = 3)
v <- which(M != 0)
rows <- 1 + (v-1) %% nrow(M)
cols <- 1 + (v-1) %/% nrow(M)
nonzeros <- data.frame(i=rows,j=cols,item=M[v])
在此示例中:
> M
[,1] [,2] [,3] [,4]
[1,] 0 2 0 0
[2,] 0 1 2 1
[3,] 0 0 0 0
> nonzeros
i j item
1 1 2 2
2 2 2 1
3 2 3 2
4 2 4 1