繁体   English   中英

如何在igraph中比较两个图的顶点并将第一个图的社区成员分配给第二个图?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM