2012-02-12 4 views
2

decompose.graph、コミュニティ検出機能igraphおよびlapplyを使用していただきありがとうございます。igraphを使用する:decompose.graph()によって構築されたコンポーネントのコミュニティメンバシップ

私は頂点属性 "label"とエッジ属性 "weight"を持つigraphオブジェクトGを持っています。私は、igraphとは異なる機能を使ってコミュニティメンバーシップを計算したいと思います。簡略化のため、walktrap.communityとしましょう。

このグラフが接続されていない、それは私が

G.

接続されたコンポーネントに にそれを分解し、各コンポーネントに walktrap.communityを実行し、その後元のグラフに、コミュニティメンバーシップの頂点属性を追加することを決めた理由は、私がやっています現在は次のようになっています

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 
} 

lapplymapplyでそれを行うことが可能であるが、それは読みにくくています。

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"を使用するのが快適ではないと感じています。私は、元のグラフに結果を割り当てることについて質問をしています。「\t(j in seq_along(Vs comps [[i]]) - )){ \t(for i in seq_along(comps) \t cur < - V(comps [[i]])[j] $ id \t \t [V(G)$ id == cur] $ "walktrap" < - V(comps [[i]] )[j] $ "walktrap" \t} }ここで、 "id"は頂点集合の一意のラベルです。それを行う唯一の方法かどうか知っていますか? – npobedina

関連する問題