2

decompose.graph对于使用和 的社区检测功能,igraph我将不胜感激lapply

我有一个带有顶点属性“标签”和边缘属性“权重”的 igraph 对象 G。我想使用 igraph 中的不同函数计算社区成员资格,为简单起见walktrap.community

这个图不是连通的,所以我决定把它分解成连通的组件并walktrap.community在每个组件上运行,然后在原始图 G 上添加一个社区成员顶点属性。

我目前正在做以下事情

comps <- decompose.graph(G,min.vertices=2)
communities <- lapply(comps,walktrap.community)

此时我被卡住了,因为我得到了结构我无法弄清楚的列表对象。上的文档decompose.graph只告诉它返回列表对象,当我lapply在结果上使用时,我完全糊涂了。此外,社区在每个组件中从 0 开始编号,我不知道如何将weights参数提供给walktrap.community函数。

如果不是组件,我会执行以下操作:

wt <- walktrap.community(G, modularity=TRUE, weights=E(G)$weight)
wmemb <- community.to.membership(G, wt$merges,steps=which.max(wt$modularity)-1)
V(G)$"walktrap" <- wmemb$membership

谁能帮我解决这个问题?或者提供一些可能有帮助的信息/链接?

4

1 回答 1

4

你可以使用一个循环:

library(igraph)
set.seed(2)
G <- erdos.renyi.game(100, 1/50)
comps <- decompose.graph(G,min.vertices=2)
length(comps)  # 2 components, in this example
for(i in seq_along(comps)) { # For each subgraph comps[[i]]
  wt <- walktrap.community(comps[[i]], modularity=TRUE, weights=E(comps[[i]])$weight)
  wmemb <- community.to.membership(comps[[i]], wt$merges,steps=which.max(wt$modularity)-1)
  V(comps[[i]])$"walktrap" <- wmemb$membership
}

lapply可以使用and来做到这一点mapply,但它的可读性较差。

comps <- decompose.graph(G,min.vertices=2)
wt <- lapply( comps, function(u)
  walktrap.community(u, modularity=TRUE, weights=E(u)$weight)
)
wmemb <- mapply( 
  function(u,v) community.to.membership(u, v$merges,steps=which.max(v$modularity)-1),
  comps, wt,
  SIMPLIFY=FALSE
)
comps <- mapply( 
  function(u,v) { V(u)$"walktrap" <- v$membership; u },
  comps, wmemb,
  SIMPLIFY=FALSE
)
于 2012-02-12T00:44:39.730 回答