Количество подключенных узлов в дендрограмме

#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() , поэтому это одна и та же функция.