r - 为每个社区提取社区节点和其他节点之间的边列表
问题描述
假设我们有一个简单的加权网络,我们在其上执行某种社区检测。接下来我们提取特定的社区,最后的任务是提取该社区的节点与所有其他节点之间的所有边。
下面我粘贴了玩具代码。
# 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
但对我来说,有必要获取包含每个社区的这些节点的整个列表。不只是为了一个。有什么建议来创建这个循环吗?如果是的话那就太好了:)
解决方案
这是我对您的问题的看法:
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)
推荐阅读
- swift - 如何在 SwiftUI 中更新 AVPlayerLayer 上正在播放的视频?
- c - 为什么我不能在 * 中获得多个空格?
- python - 如何在 Matplotlib 中的同一集群的数据点周围绘制边框
- c# - Invoke 和 BeginInvoke 不会运行真正的异步
- typescript - 如何在 VSCode 中访问 *已经加载的语言 * 的 TextMate 语法?
- python - DjangoCMS 类型错误:from_db_value() 缺少 1 个必需的位置参数:升级到 3.7.2 w/Django 3.0.1 后的“上下文”
- react-native - 使用 API KEY 使用 React Native (Expo) 获取 Google 日历事件
- elixir - 如何根据特定键将两个列表与地图合并
- java - 引起:java.net.ConnectException:连接被拒绝:没有更多信息
- string - AttributeError:“str”对象没有属性“from_header”