【发布时间】:2020-06-30 16:03:46
【问题描述】:
我有一个包含相似值的边缘列表,我需要将其转置为对称矩阵。例如,我的原始数据位于格式如下的数据框中:
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))
我需要以某种方式将其放入规则所在的矩阵中:
- “源”x“目标”之间的交集 = 相似度
- IF “源” == “目标” THEN 1.00
- 如果“源”x“目标”值的组合没有相似度得分,则用 0 填充交集
最后,数据应该是这样的:
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
实际的矩阵不会那么稀疏,大约有 30,000 行 x 30,000 列。我不确定如何处理这个问题。我可以很容易地将现有数据转换为矩阵格式。我可以很容易地用 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))
【问题讨论】:
-
Obed,您是否能够从您的样本数据中将您想要的输出变成实际想要的输出?目前很难知道行名和列名的来源。您的示例数据中没有
Target等于零。我们是否假设应该有一个,因为对角线全是 1? -
@AllanCameron 这是困难的一部分。原始数据没有对角线的数据(1,1;2,2;3,3;等)。同样,如果它有 1,2,那么它不会有 2,1。所以上面想要的输出实际上就是我想要的。我只是将其截断为 5,而不是一直到 25 以节省空间。
-
@AllanCameron 我刚刚添加了另一个示例。也许它更清楚?
-
我想我明白了。看我的回答。