R: Возвращает список ребер всех простых путей

#r #graph #igraph #tidygraph #sfnetwork

Вопрос:

Я пытаюсь получить списки ребер путей между двумя узлами с помощью tidygraph. Вот пример

 demo <- tbl_graph(nodes = tibble(name = c("A", "B", "C", "D")),
                       edges = tribble(~from, ~to,~id,
                                       "B", "A", "1",
                                       "D", "C", "2",
                                       "A", "D", "3",
                                       "A", "C", "4"),
                   node_key = "name")
 

Я использовал all_simple_paths из пакета igraph, чтобы получить все возможные пути между узлом B и узлом C.

 paths <- all_simple_paths(demo, "B", "C")
#[[1]]
#  3/4 vertices, named, from e0c8c2e:
#[1] B A C

#[[2]]
#  4/4 vertices, named, from e0c8c2e:
#[1] B A D C
 

Интересно, как создать списки ребер для всех простых путей. Спасибо.

 [1] 1 4
[2] 1 3 2
 

Ответ №1:

Обновить

Если вам просто нужен идентификатор края, вы можете использовать

 > lapply(
    all_simple_paths(demo, "B", "C"),
    function(x) {
      get.edge.ids(demo, c(rbind(head(x, -1), x[-1])))
    }
  )
[[1]]
[1] 1 4

[[2]]
[1] 1 3 2
 

Попробуйте код ниже

 lapply(
  all_simple_paths(demo, "B", "C"),
  function(x) {
    E(demo)[get.edge.ids(demo, c(rbind(head(x, -1), x[-1])))]
  }
)
 

что дает

 [[1]]
  2/4 edges from d776b98 (vertex names):
[1] B->A A->C

[[2]]
  3/4 edges from d776b98 (vertex names):
[1] B->A A->D D->C
 

Комментарии:

1. Спасибо. Но я хочу, чтобы он возвращал идентификатор края (1,2,…) вместо имени узлов.

2. @Qzhao Тогда используйте get.edge.ids(demo, c(rbind(head(x, -1), x[-1]))) только

3. Спасибо. Это работает!