Использование igraph: членство в сообществе компонентов, созданных декомпозицией .graph () - PullRequest
2 голосов
/ 12 февраля 2012

Буду признателен за помощь при использовании decompose.graph, функции обнаружения сообщества от igraph и lapply.

У меня есть объект igraph G с атрибутом вершины "label" и атрибутом ребра "weight". Я хочу рассчитать членство в сообществе, используя различные функции из 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

Может ли кто-нибудь помочь мне решить эту проблему? Или предоставить некоторые информация / ссылки, которые могут помочь?

1 Ответ

4 голосов
/ 12 февраля 2012

Вы можете использовать цикл:

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 и 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
)
...