Как определить подсети в матрице смежности? - PullRequest
1 голос
/ 03 апреля 2020

У меня есть сетевой граф "G", основанный на следующих ребрах:

library(igraph)

edges <- data.frame( 
  from=c(1,1,4,4,4,5,5,6),
  to=  c(2,3,5,6,7,6,7,7))

G <- graph_from_data_frame(d=edges,  directed=F) 

Этот пример явно содержит 2 подсети, первая с узлами 1,2,3 и вторая с узлами 4, 5.6.7. Я хотел бы:

  1. Определить, к какому узлу подсети "i" принадлежит.
  2. Количество узлов в каждой подсети.

Таким образом, в этом примере функция в идеале создаст объект с таким количеством строк, которое равно числу узлов в G, и двумя столбцами: первый содержит вектор, который указывает идентификатор подсети и вторая с размером (gsize) подсети. .

 result <- data.frame( 
  ID=c(1,1,2,2,2,2,2,2),
  gsize=c(3,3,3,4,4,4,4,4))

G <- graph_from_data_frame(d=edges,  directed=F) 

Я новичок в использовании igraph, поэтому, возможно, есть функция для этого.

1 Ответ

1 голос
/ 03 апреля 2020

Если вас интересуют только отключенные компоненты:

library(igraph)
library(dplyr)

edges <- data.frame( 
  from=c(1,1,4,4,4,5,5,6),
  to=  c(2,3,5,6,7,6,7,7))

G <- igraph::graph_from_data_frame(d=edges,  directed=F) 


# create requested dataframe

df <- data.frame(node_ID = as.vector(V(G)), 
                 community = as.vector(components(G)$membership))

required_df <- df %>% 
  dplyr::inner_join(df %>% 
                      dplyr::group_by(community) %>% 
                      dplyr::count(name = "community_size")
                    )

Если вас интересуют более сложные кластеры:

library(igraph)
library(dplyr)

edges <- data.frame( 
  from=c(1,1,4,4,4,5,5,6),
  to=  c(2,3,5,6,7,6,7,7))

G <- igraph::graph_from_data_frame(d=edges,  directed=F) 

# find subnetworks using louvain algorithm and adding to community in graph

louvain_partition <- igraph::cluster_louvain(G)

G$community <- louvain_partition$membership

# create requested dataframe

df <- data.frame(node_ID = as.vector(V(G)), community = G$community)

required_df <- df %>% 
  dplyr::inner_join(df %>% 
                      dplyr::group_by(community) %>% 
                      dplyr::count(name = "community_size")
  )
...