假设我们有一个简单的加权网络,我们在其上执行某种社区检测。接下来,我们提取特定社区,最后的任务是提取此社区的节点和所有其他节点之间的所有边缘。
下面我粘贴了玩具代码。
# 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
的边界)连接起来的边缘?
答案 0 :(得分:2)
首先获取您所在社区的所有优势:
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