给出一个图表,例如:
require(igraph)
g <- graph.famous("Zachary")
这样它的一些属性是:
diameter(g)
[1] 5
> farthest.nodes(g)
[1] 15 17 5
> average.path.length(g)
[1] 2.4082
> path.length.hist(g)
$res
[1] 78 265 137 73 8
$unconnected
[1] 0
如您所见,有8条长度= 5的路径,73条长度= 4的路径,等等...
我希望能够隔离一定长度的路径中涉及的节点组。例如,我想知道节点涉及长度为4的73个路径及其连接的节点。
让我用一个简单的例子来说明这一点,即图的直径。对于这种特殊情况,我们可以这样做:
##names of the nodes involved in the diameter path of the graph
nodes.diameter<-get.diameter(g)
edges <- as.data.frame(get.edgelist(g))
edges.diameter <- edges[which(edges$V1 %in% nodes.diameter),]
g.diameter <- graph.data.frame(edges.diameter, directed = FALSE)
##some aesthetics for the plot
V(g.diameter)$label.cex <- 1
plot(g.diameter,vertex.size=10)
这是一个特殊的例子,因为很容易获得直径的节点名称。但是,有没有办法让节点名称给定一定的路径长度?(天真地,类似于get.path(g,length = X)
,并且在一个天真的理想世界中,这将返回一个包含节点的列表参与length = X
的路径。例如,对于length = 4
,列表将包含73个元素,每个元素包含73个长度为4的路径中的每个节点。
非常感谢你的时间。
答案 0 :(得分:3)
path.length.hist
函数查看所有可能的最短路径。所以这两个命令是相同的
# path.length.hist(g)$res
[1] 78 265 137 73 8
sp <- shortest.paths(g)
table(sp[upper.tri(sp)])
# 1 2 3 4 5
# 78 265 137 73 8
表示您可以从shortest.paths()
中提取您所关注的信息。这是一个函数,它将返回路径中涉及的顶点的索引
get_paths_by_length <- function(g, len) {
sp <- shortest.paths(g)
sp[lower.tri(sp,TRUE)] <- NA
wp <- which(sp==len, arr.ind=TRUE)
mapply(function(a,b) get.shortest.paths(g, a, b)$vpath, wp[,1], wp[,2])
}
返回
get_paths_by_length(g,5)
# [[1]]
# [1] 15 33 3 1 6 17
# [[2]]
# [1] 16 33 3 1 6 17
# [[3]]
# [1] 17 6 1 3 33 19
# [[4]]
# [1] 17 6 1 3 33 21
# [[5]]
# [1] 17 6 1 3 33 23
# [[6]]
# [1] 17 6 1 3 28 24
# [[7]]
# [1] 17 6 1 9 34 27
# [[8]]
# [1] 17 6 1 3 33 30
对于长度为5的八条路径。