使用 R igraph all_simple_paths 来自各种来源并逐步构建 Origin Destination 路径

问题描述

我有一个连接如下的网络:

library(igraph)
network <- graph_from_literal(1--2,2--3,3--4,4--5,3--6,6--7,3--8,8--9)

我想找到每个起点-终点对的短路路径:

data=data.frame(Origin=c(1,8,9,2),Destination=c(4,5,6,9),km=c(22,32,43,52))
  Origin Destination km
1      1           4 22
2      8           5 32
3      9           6 43
4      2           9 52

我试过用这个:

short <- all_simple_paths(network,data$Origin,data$Destination)

但我只收到从第一个 Origin 到所有目的地的值。

[[1]]
+ 4/9 vertices,named,from 7186e74:
[1] 1 2 3 4

[[2]]
+ 5/9 vertices,from 7186e74:
[1] 1 2 3 4 5

[[3]]
+ 4/9 vertices,from 7186e74:
[1] 1 2 3 6

[[4]]
+ 5/9 vertices,from 7186e74:
[1] 1 2 3 8 9

对于每个结果,我想在“km”列中添加相应的长度:

以及包含路径每一步的第二列。

最后的结果应该是这样的:

O D Km
1 2 22
2 3 22
3 4 22 
4 - 22
8 3 32
3 4 32
4 5 32
5 - 32
9 8 43
8 3 43
3 6 43
6 - 43
2 3 52
3 8 52
8 9 52
9 - 52

我累了

b <-data.frame(unlist(short),unlist(short)) 
names(b)[1] <- "O"
names(b)[2] <- "D"

shift <- function(x,n){
  c(x[-(seq(n))],rep(NA,n))
}

b$D <- shift(b$D,1)

但我不知道如何让它工作

提前致谢!

解决方法

你可以这样

asp <- with(
  data,Map(all_simple_paths,list(network),Origin,Destination)
)

给出

[[1]]
[[1]][[1]]
+ 4/9 vertices,named,from b510974:
[1] 1 2 3 4


[[2]]
[[2]][[1]]
+ 4/9 vertices,from b510974:
[1] 8 3 4 5


[[3]]
[[3]][[1]]
+ 4/9 vertices,from b510974:
[1] 9 8 3 6


[[4]]
[[4]][[1]]
+ 4/9 vertices,from b510974:
[1] 2 3 8 9

对于最终结果,您可以尝试

do.call(
  rbind,lapply(
    seq_along(asp),function(k) {
      plst <- asp[[k]]
      do.call(
        rbind,lapply(
          plst,function(p) {
            vnm <- names(p)
            data.frame(
              O = vnm,D = c(tail(vnm,-1),NA),Km = data$km[k]
            )
          }
        )
      )
    }
  )
)

给出

   O    D Km
1  1    2 22
2  2    3 22
3  3    4 22
4  4 <NA> 22
5  8    3 32
6  3    4 32
7  4    5 32
8  5 <NA> 32
9  9    8 43
10 8    3 43
11 3    6 43
12 6 <NA> 43
13 2    3 52
14 3    8 52
15 8    9 52
16 9 <NA> 52