#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. Спасибо. Это работает!