2012-02-12 8 views
2

Я был бы признателен за помощь в использовании decompose.graph, функции обнаружения сообщества от igraph и lapply.Использование igraph: членство в сообществах компонентов, созданных методом разложения.graph()

У меня есть объект 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

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

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 
) 
+0

Большое спасибо за такой быстрый и точный ответ. Я согласен с тем, что первый вариант выглядит намного читабельнее, к тому же я до сих пор не чувствую себя комфортно, используя «* apply». У меня возникает вопрос о присвоении результатов исходному графику: 'for (i in seq_along (comps)) { \t для (j in (seq_along (V (comps [[i]])) - 1)) { \t \t cur <- V (comps [[i]]) [j] $ id \t \t V (G) [V (G) $ id == cur] $ "walktrap" <- V (comps [[i]]) [j] $ «walktrap» \t} } ', где« id »- это уникальная метка на множестве вершин. Вы знаете, что это единственный способ сделать это? – npobedina