我有一个如下图:
adj <- read.table(text = " A B C D
A 0 1 0 0
B 1 0 1 1
C 0 1 0 0
D 0 1 0 0
",header=T)
g<-graph_from_adjacency_matrix(as.matrix(adj))
我想像下面那样计算每个节点的距离:
distMat<-1/2^distances(g)
for (i in 1:nrow(distMat)) {
res[i]<-sum( distMat[i,]) - distMat[i,i]
}
names(res) <- V(g)$name[V(g)]
res
但是结果中的值数应该等于图中的节点数,但不是。我有5个值而不是4个值。知道如何解决吗?
答案 0 :(得分:1)
您的代码未返回5个值。您可能会遇到麻烦的原因之一是您的代码比需要的复杂得多。看看它的作用:
res <- 1:nrow(distMat)
for (i in 1:nrow(distMat)) {
res[i]<-sum( distMat[i,]) - distMat[i,i]
}
是距离矩阵的一个循环,其中在减去distMat[i,i]
之前必须总结每一行,1
必须始终为distMat[i,i]
,因为res <- rowSums(1/2^distances(g))-1
是指每个节点到其自身的距离。更好的重写方法是:
degree()
然后可以很容易地看到,这种计算实际上是集中度度量。与其他所有节点的距离之和最低将与较高的中心度相关联。
iGraph具有计算全部已记录和已建立的中心度度量值的功能。请参见closeness()
,betweenness()
或# Make random graph with more nodes and calculate your centrality measure as res
graph <- erdos.renyi.game(80, 100, "gnm", directed=FALSE)
res <- rowSums(1/2^distances(graph))-1
# Colour each node according to their distance to every other node
colfunc <- colorRampPalette(c("yellow", "red"))
gradient <- colfunc(max(res, na.rm=T))
V(graph)$color <- gradient[round(res)+1]
# Plot it
plot(graph, vertex.label="")
。您的优势是什么?
查看您的集中度度量并使用以下代码进行测试:
res <- betweenness(graph)
例如,使用{{1}}进行游戏。