R中的循环输出中具有多余的值

时间:2018-08-19 11:12:53

标签: r for-loop distance igraph

我有一个如下图:

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个值。知道如何解决吗?

1 个答案:

答案 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}}进行游戏。