用R中的iGraph获取路径的权重

时间:2018-04-06 14:48:55

标签: r igraph directed-graph

我有一个我从数据框创建的图表,格式为from, to, cost列。我还有一个路径(作为一系列顶点,vpath格式的igraph),它是有效的(我的图是有针对性的)。

根据我的图表和路径,是否有任何功能会给我这条路的费用?

我没有要求最短的路径,因为我从all_shortest_paths获得了路径。但是,我只获得节点连续而不是路径的权重,这也是我需要的。

编辑:数据

这是我的数据框,我将其转换为图表:http://www.sharecsv.com/s/47209742f0052a37e17db37ea3af63ac/arcsWithCost.csv

我的路径是15 4 50 212 183 112 114 37 228 119

1 个答案:

答案 0 :(得分:2)

您将路径作为顶点序列。如果你有一系列边缘,这很容易 - 只需加上每条边的权重。所以你需要做的是将顶点序列转换为一系列边。这就是get.edge.ids所做的,尽管您需要将数据转换为正确的格式。

由于您没有提供任何数据,我将以随机示例进行说明。

library(igraph)
set.seed(1234)
g = erdos.renyi.game(10,0.15, directed=TRUE)
E(g)$weight = sample(5, length(E(g)), replace=TRUE)
plot(g)

Graph

好的,现在假设我们想要从节点1-4-10-3沿路径求和。 我假设您有一个列表c(1,4,10,3)

VP = c(1,4,10,3)
EP = rep(VP, each=2)[-1]
EP = EP[-length(EP)]
E(g)$weight[get.edge.ids(g, EP)]
[1] 1 5 4
sum(E(g)$weight[get.edge.ids(g, EP)])
[1] 10

增加:

在添加到问题的数据中,有110个节点,但它们的编号最高为281.这些数字是节点的标签,但不是节点ID。您可以使用标签访问节点,但必须将它们转换为字符串才能将它们视为标签。此代码适用于您的示例。

VP = c(15, 4, 50, 212, 183, 112, 114, 37, 228, 119)
EP = rep(VP, each=2)[-1]
EP = EP[-length(EP)]
E(g)$cost[get.edge.ids(g, as.character(EP))]
sum(E(g)$cost[get.edge.ids(g, as.character(EP))])