如何使用R中的igraph选择基于长度的图形的某些路径

时间:2015-01-20 17:45:28

标签: r igraph

给出一个图表,例如:

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) 

enter image description here

这是一个特殊的例子,因为很容易获得直径的节点名称。但是,有没有办法让节点名称给定一定的路径长度?(天真地,类似于get.path(g,length = X),并且在一个天真的理想世界中,这将返回一个包含节点的列表参与length = X的路径。例如,对于length = 4,列表将包含73个元素,每个元素包含73个长度为4的路径中的每个节点。

非常感谢你的时间。

1 个答案:

答案 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的八条路径。