R 将非重复边列表转换为对称矩阵

R 将非重复边列表转换为对称矩阵,r,matrix,R,Matrix,我有一个带有相似值的边列表,我需要把它转换成一个对称矩阵。例如,我的原始数据位于以下格式的数据框中: example <- data.frame(Source = c(0,4,2,2,5,0,1,3,0,10,6,11,7,2), Target = c(1,6,12,13,13,14,14,15,17,17,20,23,24,25), Similarity = c(0.004,0.0009,0.007,0.02,0.0

我有一个带有相似值的边列表,我需要把它转换成一个对称矩阵。例如,我的原始数据位于以下格式的数据框中:

example <- data.frame(Source = c(0,4,2,2,5,0,1,3,0,10,6,11,7,2),
                  Target = c(1,6,12,13,13,14,14,15,17,17,20,23,24,25),
                  Similarity = c(0.004,0.0009,0.007,0.02,0.0011,0.0018,0.011,0.0013,0.006,0.005,0.0006,0.005,0.0026,0.0013))
     0      1     2     3     4     5
0   1.0   0.004   0     0     0     0
1  0.004   1.0    0     0     0     0
2    0      0    1.0    0     0     0
3    0      0     0    1.0    0     0
4    0      0     0     0    1.0    0
5    0      0     0     0     0    1.0
实际的矩阵不会非常稀疏,将有约30000行x30000列。我不知道该怎么做。我可以很容易地将现有数据转换成矩阵格式。我可以很容易地用0填充缺少的值。但是,将原始数据转换为对称矩阵并用1.0填充对角线,而用0填充所有其他缺失的值,这是我无法理解的

编辑:问这个问题的一个更简单的方法是“我如何从这些数据中生成对称矩阵”

example <- data.frame(Source = c(0,0,0,0,1,1,1,1),
                      Target = c(1,2,3,4,2,3,4,5),
                      Similarity = c(0.004,0.0009,0.007,0.02,0.0011,0.0018,0.011,0.006))

example您可以使用
diag
获得单位矩阵,然后用循环对称地填充单元格。我们必须在所有索引中添加一个1,因为你的矩阵是零索引的。请注意,此示例以科学记数法打印第一列,但您可以看到它与第一行相同

mat 1 4e-03 1.0000 0.0011 0.0018 0.011 0.006
#>2 9e-04 0.0011 1.0000 0.0000 0.000 0.000
#>3 7e-03 0.0018 0.0000 1.0000 0.000 0.000
#>4 2e-02 0.0110 0.0000 0.0000 1.000 0.000
#>5 0e+00 0.0060 0.0000 0.0000 0.000 1.000

由(v0.3.0)于2020-06-30创建您可以使用
矩阵库

乙二醇

库(矩阵)

Obed,您是否能够使您的期望输出成为样本数据的实际期望输出?现在知道你的行名和列名来自哪里是相当混乱的。在示例数据中,没有小于或等于零的
目标。因为对角线上都是1,所以我们认为应该有1吗?@AllanCameron,这是困难的一部分。原始数据没有对角线的数据(1,1;2,2;3,3;等等),同样,如果它有1,2,那么它将没有2,1。因此,上面所期望的输出实际上是我想要的。为了节省空间,我只是将其截断为5,而不是一直增加到25。@AllanCameron我刚刚添加了另一个示例。也许更清楚?我想我明白了。请看我的答案。有没有办法将DIMNAME分配给输出矩阵?例如,我尝试了
dimnames(A)@Obed在
sparseMatrix
函数中有一个名为dimnames的参数。看看这是一个很酷的解决方案。如何标记输出矩阵的行/列?例如,“1”而不是[1,]。我最终会将此矩阵用于PCA和/或TSNE,并希望使用行名称来标记结果图上的标记。@Obed yes!具有讽刺意味的是,这正是我在回答你的最后一个问题时向你展示的,你今天早些时候没有接受!我又把它放在这里了。太棒了,谢谢!我不是故意不接受你先前的回答。还有一个答案同样有效。没有意识到这样做会让你无法接受!
library(Matrix)

A <- sparseMatrix(i = example$Source + 1, 
                  j = example$Target + 1,
                  x = example$Similarity, symmetric = TRUE)
diag(A) <- 1


head(A)
6 x 26 sparse Matrix of class "dgCMatrix"
                                                                                                 
[1,] 1.000 0.004 . . . . .      . . . . . .     .      0.0018 .      . 0.006 . . . . . . . .     
[2,] 0.004 1.000 . . . . .      . . . . . .     .      0.0110 .      . .     . . . . . . . .     
[3,] .     .     1 . . . .      . . . . . 0.007 0.0200 .      .      . .     . . . . . . . 0.0013
[4,] .     .     . 1 . . .      . . . . . .     .      .      0.0013 . .     . . . . . . . .     
[5,] .     .     . . 1 .  9e-04 . . . . . .     .      .      .      . .     . . . . . . . .     
[6,] .     .     . . . 1 .      . . . . . .     0.0011 .      .      . .     . . . . . . . .