我正在使用R和来自igraph库的特征向量中心算法。我们有以下sql表:
person1 / person2 / score
A / B / 0.568
A / C / 1.233
B / A / 0.798
B / C / 0.493
C / A / 1.367
C / B / 1.276
这些值是两个人之间关系的分数。
两个问题: - 如何从上表中以分数作为权重在R中创建矩阵? Result
Person A B C
A - 0.568 1.233
B 0.798 - 0.493
C 1.367 1.276 -
答案 0 :(得分:2)
要在计算特征向量中心性时应用边权重,只需使用<p>{{theme_settings.my_license_key}}</p>
weights
选项引用权重:
eigen_centrality
获得权重的邻接矩阵:
rm(list=ls())
library(igraph)
# Some sample data, source: http://www.shizukalab.com/toolkits/sna/weighted-edgelists
el <- structure(list(V1 = c(23732L, 23732L, 23778L, 23778L, 23871L,
23871L, 23871L, 58009L, 58098L, 58256L), V2 = c(23871L, 58098L,
23732L, 23824L, 23778L, 58009L, 58098L, 58098L, 23778L, 58098L
), weight = c(1L, 10L, 8L, 1L, 15L, 1L, 5L, 7L, 1L, 1L)), .Names = c("V1",
"V2", "weight"), class = "data.frame", row.names = c(NA, -10L
))
g <- graph.data.frame(el)
# Only showing the centrality scores, hence the $vector
eigen_centrality(g, directed=TRUE, weights=E(g)$weight)$vector
# 23732 23778 23871 58009 58098 58256 23824
# 0.53685043 0.39782138 0.09055835 0.01527579 1.00000000 0.00000000 0.06710630
答案 1 :(得分:1)
通过创建新矩阵,按人1和2命名行和列,然后将值分配到正确的位置,只是一种快速而又脏的方法。我们使用了两个没有被新用户讨论过的R技巧。
1)您可以按名称提取对象的元素。
2)您可以使用双列矩阵进行子集化。
p1 <- sort(unique(df$person1))
p2 <- sort(unique(df$person2))
mat <- matrix(0, length(p1), length(p2))
rownames(mat) <- p1
colnames(mat) <- p2
mat[as.matrix(df[1:2])] <- df$score
mat
# A B C
# A 0.000 0.568 1.233
# B 0.798 0.000 0.493
# C 1.367 1.276 0.000