gpt4 book ai didi

r - 如何从图中获取从节点到节点的边权重之和

转载 作者:行者123 更新时间:2023-12-04 17:09:07 24 4
gpt4 key购买 nike

我们可以使用 igraph 包的 strength 函数对每个顶点的相邻边的边权重求和。假设我们有如下图所示

graph

可重现的数据和代码

nodeA <- c("ID_1", "ID_2", "ID_3", "ID_4", "ID_5", "ID_16", "Node_30")
nodeB <- c("ID_11", "ID_3", "ID_4", "ID_5", "ID_3", "ID_11", "Node_3")
edge_weight <- c(0.5, 0.9, 0.8, 0.7, 0.5, 0.09, 0.7)
df_1 <- data.frame(nodeA, nodeB, edge_weight)

graph1 <- graph_from_data_frame(df_1, directed = FALSE)
E(graph2)$weight <- df_1$edge_weight
plot(graph1)

edge_strengts <- strength(graph1)

strength 函数的输出是图中每个顶点的边权重之和。

 ID_1    ID_2    ID_3    ID_4    ID_5   ID_16 Node_30   ID_11  Node_3 
0.50 0.90 2.20 1.50 1.20 0.09 0.70 0.59 0.70

现在,我有一个边列表,我只想获取这些列表的边权重之和(而不是获取一个顶点的边之和)。为了更清楚地说明,假设我有给定的边缘列表,

         nodeA      nodeB 
1 ID_2 ID_4
2 ID_2 ID_5
3 ID_1 ID_16

我只想从给定的图中获取上面列出的边的边总和(注意该图是无向的)。输出应该是这样的

         nodeA      nodeB    some_of_weight
1 ID_2 ID_4 1.70
2 ID_2 ID_5 1.40
3 ID_1 ID_16 0.59

对于第一条边(ID_2 到 ID_4),总和是 1.70(例如:ID_2 到 ID_3 = 0.9,ID_3 到 ID_4 = 0.8,所以,0.9 + 0.8 = 1.70) 等等所有边列表。

你能告诉我,我该如何做这份工作吗?

一条边的多条路径

图可以包含多条边路径(即,对于一条边,我们可以有 1 条或多条不同的路径)。比方说,我们可以通过两种方式从 ID_3 到 ID_4 (i) ID_3 -- ID_2 -- ID_4(总路径权重为 2.4)和 (ii) ID_3 -- ID_5 -- ID_4(总路径权重为 1.5)。在这种情况下,我想取最大路径权重。

多条路径的可重现数据

nodeA <- c("ID_1", "ID_2",  "ID_4", "ID_5", "ID_16", "Node_30", "ID_6", "ID_2")
nodeB <- c("ID_11", "ID_3", "ID_5", "ID_3", "ID_11", "Node_3", "ID_3", "ID_4")
edge_weight <- c(0.5, 0.9, 0.8, 0.7, 0.5, 0.09, 0.7, 1.5)

最佳答案

更新

由于你正在寻找两个顶点之间的最长路径,你可以尝试下面的代码

df_2$max_sum_weight <- apply(
df_2,
1,
function(x) {
max(sapply(
all_simple_paths(graph1, x[["v"]], x[["to"]]),
function(v) {
sum(E(graph1)$weight[get.edge.ids(graph1, c(rbind(head(v, -1), v[-1])))])
}
))
}
)

给出

> df_2
v to max_sum_weight
1 ID_2 ID_4 2.4
2 ID_2 ID_5 2.3
3 ID_1 ID_16 1.0
4 ID_3 ID_4 2.4

数据

df_2 <- data.frame(
v = c("ID_2", "ID_2", "ID_1", "ID_3"),
to = c("ID_4", "ID_5", "ID_16", "ID_4")
)

上一个答案(最短路径)


试试 shortest.paths

transform(
df_2,
sum_of_weight = diag(shortest.paths(graph1, v, to))
)

transform(
df_2,
sum_of_weight = shortest.paths(graph1)[as.matrix(df_2)]
)

给出

     v    to sum_of_weight
1 ID_2 ID_4 1.70
2 ID_2 ID_5 1.40
3 ID_1 ID_16 0.59

关于r - 如何从图中获取从节点到节点的边权重之和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69860347/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com