![](/img/trans.png)
[英]How to compare two graphs to Identify number of same/different edges between two graph using igraph R package
[英]How to compare vertices of two graphs and assign community membership of the first graph to the second graph, in igraph?
我的问题是如何使用R中的igraph比较两个图的顶点,以及将第一个图的社区成员分配给第二个图。
请考虑以下示例:
karate <- graph.famous("Zachary")
g <- graph(c(17,1, 2,1, 32,2, 5,2, 3,1, 33,3, 30,3, 33,3, 21,3, 4,3, 25,4, 10,4,
18,5, 6,7, 8,4, 11,1, 6,11, 13,1, 13,4, 14,4, 14,4, 14,5, 15,7, 17,7,
18,2, 20,1, 12,24, 26,1, 31,2, 32,1, 19,33), directed = FALSE)
V(g)$name <- V(g)
wckarate <- walktrap.community(karate)
V(karate)$name <- V(karate)
V(karate)$comm <- membership(wckarate)
解决方案1,对于大型图形来说太慢了:
for (i in 1:length(V(karate))) {
for (j in 1:length(V(g))){
if (V(karate)$name[i] == V(g)$name[j]) {
V(g)$comm[j] <- V(karate)$comm[i]
}
}
}
解决方案2,转换为数据框以使用dplyr
:
A <- data.frame(Name = V(karate)$name, Comm = V(karate)$comm, stringsAsFactors = FALSE)
B <- data.frame(Name = V(g)$name, stringsAsFactors = FALSE)
B <- left_join(B, A)
但是在这种解决方案中,我不知道如何从包含顶点名称的数据框中创建图形。
有人可以建议其他解决方案吗? 先感谢您。
我认为最简单的是
V(g)$comm <- V(karate)[ V(g)$name ]$comm
该解决方案假定g
的顶点都包含在karate
。 这里发生的是,您可以使用字符向量索引命名图的顶点序列,然后选择指定的顶点:
V(karate)[ V(g)$name ]
#> Vertex sequence:
#> [1] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#> [26] 26 27 28 29 30 31 32 33
然后,您可以选择这些顶点的comm
属性,然后按g
顶点的顺序获取comm
。
如果只想为普通顶点设置此选项,也很简单:
common <- intersect(V(g)$name, V(karate)$name)
V(g)[common]$comm <- V(karate)[common]$comm
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.