2012-10-21 10 views
12

私はRのためにigraphを使用しています。私のグラフは平行エッジ(同じソースとターゲットを持つ複数のエッジ)を含むエッジグリストに基づいています。これらの平行なエッジをエッジ属性の重みに変換したいと思います。これを行うためのeay方法はありますか?R igraph平行エッジをウェイトアトリビュートに変換する

簡単な方法がない場合。これらの平行なエッジをどのように識別できますか?

duplicated(E(net)) 

は単一の複製を返しません。私はそれが重複したエッジIDを探していると思います。

答えて

21

あなたはまた、E(graph)$weight <- 1を使用することができ次にsimplify(graph, edge.attr.comb=list(weight="sum"))を使用して、各エッジに1の重みを割り当て、次に重みを加算しながら複数のエッジを単一のものに崩壊させます。

+2

このソリューションは線形の空間と時間を使用するため、実際にははるかに優れていますが、隣接行列解は2次(頂点の数として)の空間と時間を使用します。 –

+1

Btw。ループのエッジもなくなるので、必要がない場合は 'simplify()'に 'remove.loops = FALSE'引数を使用してください。 –

4

igraphに隣接マトリックスに平行なエッジを有する重み付けされていないグラフをエクスポートすると、再度読み取ることができる量としてエッジの数と重みリストを作成するようだ:

library("igraph") 
E <- matrix(c(1,1,1,2,2,2),3,2) 
G <- graph.edgelist(E) 

G2 <- graph.adjacency(get.adjacency(G),weighted=TRUE) 
+0

これは非常に大規模なグラフのための本当に便利なソリューションです。 – timothyjgraham

0

あなたは、グラフに重み属性を追加することなく、グラフの並列エッジの数を取得したい場合は、次の機能を使用できます。

duplicated <- function(graph){ 
    g_local <- graph 
    E(g_local)$weight <- 1 
    g_simp <- simplify(g_local, edge.attr.comb=list(weight="sum")) 
    w <- E(g_simp)$weight 
    return(sum(w-1)) 
} 
関連する問題