12

グラフ (G) 内の 2 つのノード (「V」と「U」と呼びます) を単一のノード (V) にマージしようとしています。

G は、779 個のノード (Web サイト) のハイパーリンク ネットワークです。各エッジはハイパーリンクを表します。V と U は実際には同じ Web サイトですが、残念ながらその Web サイトの Web ページは 2 つの別々のノードに分割されています。そのため、それらを 1 つのノードにまとめたいと考えています。

contract.vertices 関数を調査しましたが、ここでそれを適応させる方法がわかりません。

これが私のグラフの属性です(G)。

> G
IGRAPH D--- 779 3544 -- 
+ attr: Image File (v/c), Ringset (v/n), Country Code TLD (v/n), Generic TLD (v/n), Number of Pages (v/n), Categorical 1 (v/n), Categorical 2 (v/n),
  Categorical 3 (v/n), id (v/c), label (v/c), Width (e/n)

マージしたい 2 つのノードがあります。

> V(g)$id[8]
[1] "http://www.police.uk/"

> V(g)$id[14]
[1] "http://police.uk/"

合計で、グラフには 779 個のノードと 3544 個のエッジがあります。

これらの 2 つのノードをグラフ内で単一のノードにしたい (つまり、同じ「ID」を持つ)。他のノードとの間のすべてのインリンクとアウトリンクは、この新しい単一ノードのみを指すようになります。

他のすべての属性は、例外を除いて同じままですNumber of Pages(この値は、マージされる前の両方のノードの合計になります)。

4

1 に答える 1

18

contract.verticesは確かに試すのに適した機能ですが、その API は少し複雑です。これは、ノードの 1 つのペアだけでなく、1 つのパスで複数のペアをマージできるように設計されているためです。(頂点を並べ替えることもできます)。そのためには、古い頂点 ID から新しい頂点 ID へのマッピングが必要です。

頂点 ID に慣れていない場合: igraph はグラフの各頂点を 1 から N の範囲の整数で識別します。N は頂点の数です。contract.vertices必要なマッピングは、長さ N のリストである必要があります。リストの i 番目の要素には、マージ前の ID i に対応するノードの新しいID が含まれます。

グラフに 10 個のノードが含まれているとします。次のマッピング ベクトルは、各ノードを既に持っている同じ ID にマップするだけなので、マージは行われません。

c(1,2,3,4,5,6,7,8,9,10)

ここで、ノード 7 をノード 4 にマージするとします。ノード 7 の新しいID が 4 になることを igraph に伝える必要があるため、上記のベクトルの 7 番目の要素を 4 に変更する必要があります。

c(1,2,3,4,5,6,4,8,9,10)

これでほぼ問題なく動作します。問題は、igraph ではノード ID が 1 から N の範囲内にある必要があることです。上記のマッピングに従って ID 10 のノードがまだあるため、igraph は古いノード 7 を削除しません。after で手動で削除できますdelete.vertices。または、ノード 7 をノード 4 にマージするだけでなく、ノード 8 の ID を 7 に、ノード 9 を 8 に、ノード 10 を 9 に変更する別のマッピングを指定することもできます。

c(1,2,3,4,5,6,4,7,8,9)

ここでNumber of Pages、新しいノードのアトリビュートを 2 つの古いノードの値の合計にする必要があるため、マージ中に頂点アトリビュートをどう処理するかを igraph に指示する必要があります。のvertex.attr.combパラメーターcontract.verticesはこの目的に役立ちます。あなたの場合、の値は次のvertex.attr.combようになります。

list("Number of Pages"="sum", "first")

ここ"Number of Pages"="sum"で、属性の新しい値はNumber of Pages古い属性値を合計して計算する必要があることを"first"意味し、ここで言及されていない他のすべての属性については、新しい値は、ノードのセットの最初のノードの古い値によって決定する必要があることを意味します。 1 つに統合されます。?attribute.combinationこの引数の形式の詳細については、R を参照してください。

于 2013-09-26T11:29:39.757 に答える