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 . . . . . . . . . . . .