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

时间:2014-11-29 21:48:45

标签: r graph 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)

但是在这个解决方案中,我不知道如何从包含顶点名称的数据框创建图形。

有人可以建议另一种解决方案吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

我认为最简单的是

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属性,然后按照comm顶点的顺序获取g

如果你只想为公共顶点设置它,那也很简单:

common <- intersect(V(g)$name, V(karate)$name)
V(g)[common]$comm <- V(karate)[common]$comm