#r #ggraph #tidygraph
#r #ggraph #график аккуратности
Вопрос:
Недавно начал работать с пакетами tidygraph и ggraph и столкнулся с относительно простой проблемой, хотя, как ни странно, не может найти простого решения. Сколько узлов в сети подключено от одного родительского узла? Казалось бы, довольно простой вопрос, но я изо всех сил пытался найти ответ, особенно когда существует несколько отношений «родитель / потомок», которые необходимо развернуть.
# reproducible example -----------------
library(tidygraph)
library(ggraph)
library(tidyverse)
parent_child <- tribble(
~parent, ~child,
"a", "b",
"b", "c",
"b", "d",
"d", "e",
"d", "f",
"d", "g",
"g", "z"
)
# converted to a dendrogram ------------
parent_child %>%
as_tbl_graph() %>%
ggraph(layout = "dendrogram")
geom_node_point()
geom_node_text(aes(label = name),
vjust = -1,
hjust = -1)
geom_edge_elbow()
Этот результат представляет собой сеть
Что я хочу знать; сколько узлов подключено к точке «b» при перемещении из / вниз (игнорируя узел «a»)? Ответ, который я ожидал бы, равен 6, или, включая «b», затем 7.
Я запускаю это по сети, насчитывающей около 5000 пользователей, поэтому фильтрация отдельных узлов по имени не является отличным решением. Больше никто в моем офисе не знаком с сетевым анализом, поэтому я был предоставлен самому себе, чтобы разобраться в этом. Действительно надеюсь, что у кого-то есть понимание! В то же время будем продолжать рассматривать проблему и возможные решения 🙂 Спасибо вам всем!
Ответ №1:
Одним из способов было бы использовать ego_size()
из igraph
пакета. Для этого нужен order
параметр, но вы могли бы использовать количество ребер, чтобы зафиксировать максимально возможный порядок окрестности.
library(igraph)
g <- graph_from_data_frame(parent_child)
ego_size(g, order = ecount(g), nodes = "b", mode = "out", mindist = 1)
[1] 6
Для нескольких узлов просто передайте вектор интересующих узлов:
ego_size(g, order = ecount(g), nodes = c("b", "d", "g"), mode = "out", mindist = 1)
[1] 6 4 1
Комментарии:
1. Я думаю, что это очень хорошо решает проблему, с которой я столкнулся; когда я просматривал пакеты tidygraph и igraph, не понимал, что означают функции ego_size или ego. Буду экспериментировать с этим решением, но я думаю, что это решение. Спасибо за вашу помощь в этом!
2. Вместо того, чтобы использовать функцию ecount(), решено использовать функцию graph_size или graph_order для указания протяженности сети (обе выполняют почти то же самое, что ecount или vcount). В любом случае, ваше решение сработало отлично 🙂
3. Достаточно справедливо — для записи
tidygraph::graph_size()
является оболочкой дляigraph::gsize()
, которая также является псевдонимомecount()
, поэтому это одна и та же функция.