【问题标题】:Extract a list of edges between community nodes and other nodes for each community为每个社区提取社区节点和其他节点之间的边列表
【发布时间】:2019-04-21 21:02:55
【问题描述】:

假设我们有一个简单的加权网络,我们在该网络上执行某种社区检测。接下来我们提取特定的社区,最后的任务是提取该社区的节点与所有其他节点之间的所有边。

下面我粘贴了玩具代码。

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

社区#1有5个节点,社区#2有12个节点,以此类推

> 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

但对我来说,有必要获取包含每个社区的这些节点的整个列表。不只是为了一个。有什么建议来创建这个循环吗?如果是的话那就太好了:)

【问题讨论】:

    标签: r cluster-analysis igraph


    【解决方案1】:

    这是我对您的问题的看法:

    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)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-17
    • 2019-02-14
    • 1970-01-01
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多