Извлечение ребер между узлами сообщества и другими узлами

#r #igraph

#r #igraph

Вопрос:

Предположим, у нас есть простая взвешенная сеть, в которой мы выполняем своего рода обнаружение сообщества. Затем мы извлекаем конкретное сообщество, и заключительной задачей является извлечение всех ребер между узлами этого сообщества и всеми другими узлами.

Ниже я вставил код игрушки.

 # Create toy graph
library(igraph)
set.seed(12345)
g <- make_graph("Zachary")
# Add weights to edges
E(g)$weight <- sample(x = 1:10, size = ecount(g), replace = TRUE)
# Run community detection
cl <- cluster_louvain(g)
  

Есть 5 узлов, которые принадлежат сообществу #1 , 12 узлов, которые принадлежат сообществу #2 , и т.д.

 > table(membership(cl))
 1  2  3  4 
 5 12  2 15
  

Теперь мы извлекаем сообщество #1 :

 g1 <- induced_subgraph(g, which(cl$membership == 1))
  

Вопрос: как найти ребра, которые соединяют узлы в сообществе # 1 со всеми другими узлами (исключая ребра, которые определяют сообщество #1 )?

Ответ №1:

Начните с получения всех ребер, основанных на вашем сообществе:

 all_edges <- E(g)[inc(V(g)[membership(cl) == 1])]
all_edges
  10/78 edges:
 [1] 1-- 5 1-- 6 1-- 7 1--11 5-- 7 5--11 6-- 7 6--11 6--17 7--17
  

Затем отфильтруйте те, которые являются полностью внутренними (обе вершины находятся в сообществе):

 all_edges_m <- get.edges(g, all_edges) #matrix representation

all_edges[!(
 all_edges_m[, 1] %in% V(g)[membership(cl) == 1] amp; 
   all_edges_m[, 2] %in% V(g)[membership(cl) == 1]
 )] # filter where in col1 and col2
  4/78 edges:
[1] 1-- 5 1-- 6 1-- 7 1--11