从稀疏到数据帧

时间:2018-10-05 09:44:32

标签: r dataframe matrix sparse-matrix

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

我已经看到很多问题,询问如何采取相反的行动,所以我想这并不复杂,但是我找不到有效的方法。

感谢您的帮助

2 个答案:

答案 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