Извлечь список ребер между узлами сообщества и другими узлами для каждого сообщества - PullRequest
0 голосов
/ 19 ноября 2018

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

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

# 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)?

Ниже приведен ответ, относящийся к определенному сообществу

Вы начинаете с того, что получаете все преимущества в своем сообществе:

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] & 
   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

Но для меня необходимо получить весь список, содержащий эти узлы для каждого сообщества. не только для одного. Есть какие-нибудь предложения по созданию этого цикла? Было бы замечательно, если да:)

1 Ответ

0 голосов
/ 19 ноября 2018

Вот мой взгляд на вашу проблему:

library(igraph) 
set.seed(12345)
g <- make_graph("Zachary")
E(g)$weight <- sample(x = 1:10, size = ecount(g), replace = TRUE)
cl <- cluster_louvain(g)

добавить членство в качестве атрибута вершины

V(g)$name <- membership(cl)

получить список ребер

x <- as_edgelist(g, names = T)

вот все ребракоторые соединяют вершины разных сообществ

V(g)$name <- 1:vcount(g)
E(g)[x[,1] != x[,2]]

необязательная проверка

 E(g)$color <- ifelse(x[,1] != x[,2], "red", "blue")
 plot(g, edge.color = E(g)$color)
 plot(cl, g)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...