Wie füge ich zwei Knoten zu einem einzigen Knoten mit Hilfe von igraph

8

Ich versuche, zwei Knoten in einem Graphen (G) in einen einzigen Knoten (V) zusammenzufassen (sie 'V' und 'U' zu nennen).

G ist ein Hyperlink-Netzwerk von 779 Knoten (Websites). Jede Kante repräsentiert einen Hyperlink. V und U sind eigentlich die gleiche Website, aber leider sind die Webseiten von dieser Website in zwei separate Knoten aufgeteilt worden. Also möchte ich sie wieder zu einem einzigen Knoten zusammenfügen.

Ich habe die contract.vertices-Funktion recherchiert, aber ich kann nicht verstehen, wie ich sie hier anpassen soll.

Hier sind die Attribute meines Graphen (G).

%Vor%

Ich habe zwei Knoten, die ich zusammenführen möchte:

%Vor%

und

%Vor%

Insgesamt gibt es 779 Knoten und 3544 Kanten im Graph.

Ich möchte, dass diese zwei Knoten zu einem einzelnen Knoten in dem Graphen werden (d. h. sie werden dieselbe "ID" haben). Alle In- und Outlinks von / zu anderen Knoten zeigen jetzt nur auf diesen neuen einzelnen Knoten.

Alle anderen Attribute bleiben gleich, mit Ausnahme von Number of Pages (der Wert ist die Summe der beiden Knoten, bevor sie zusammengeführt werden).

    
timothyjgraham 25.09.2013, 06:29
quelle

1 Antwort

12

contract.vertices ist in der Tat die richtige Funktion, aber das API ist ein wenig kompliziert, da es so entworfen wurde, dass es nicht nur ein einzelnes Knotenpaar, sondern auch mehrere Paare in einem einzigen Durchgang zusammenführen kann. (Es kann auch Vertices permutieren). Zu diesem Zweck erfordert es ein Mapping von den alten Scheitelpunkt-IDs zu den neuen Scheitelpunkt-IDs.

Falls Sie mit Vertex-IDs nicht vertraut sind: iigraph identifiziert jeden Eckpunkt des Graphen mit einer Ganzzahl im Bereich von 1 bis N, wobei N die Anzahl der Vertices ist. Das Mapping, das contract.vertices erfordert, muss eine Liste der Länge N sein, wobei das i-te Element der Liste die neue ID des Knotens enthält, die der ID i vor dem Merging entspricht .

Angenommen, Ihr Diagramm enthält 10 Knoten. Der folgende Mapping-Vektor ordnet jeden Knoten einfach der gleichen ID zu, die er bereits hat, sodass er nicht zusammengeführt wird:

%Vor%

Nehmen wir jetzt an, dass Sie Knoten 7 in Knoten 4 zusammenführen möchten. Sie müssen igraph mitteilen, dass die neue ID von Knoten 7 4 ist. Sie müssen also das 7. Element in der über Vektor zu 4:

%Vor%

Dies wird fast die Arbeit machen; Das Problem besteht darin, dass igraph die Knoten-IDs im Bereich von 1 bis N benötigt und da Sie gemäß obiger Abbildung immer noch einen Knoten mit der ID 10 haben, wird der alte Knoten 7 nicht gelöscht Sie können sie entweder manuell mit delete.vertices löschen, nachdem Sie die Scheitelpunkte geschlossen haben, oder Sie können eine andere Zuordnung angeben, die Knoten 7 nicht nur in Knoten 4 zusammenfasst, sondern auch die ID von Knoten 8 zu 7, Knoten 9 zu 8 und Knoten 10 zu 9:

%Vor%

Da das Attribut Number of Pages des neuen Knotens auch die Summe der Werte der beiden alten Knoten sein soll, müssen Sie während der Zusammenführung angeben, was mit den Scheitelpunktattributen zu tun ist. Der Parameter vertex.attr.comb von contract.vertices erfüllt diesen Zweck. In Ihrem Fall sollte der Wert von vertex.attr.comb etwa so aussehen:

%Vor%

wobei "Number of Pages"="sum" bedeutet, dass der neue Wert des Attributs Number of Pages durch Summieren der alten Attributwerte berechnet werden soll und "first" bedeutet, dass für alle anderen Attribute, die hier nicht erwähnt werden, der neue Wert von der Methode bestimmt werden soll alter Wert des ersten Knotens unter der Menge der Knoten, die zu einem einzigen Knoten zusammengefügt sind. Weitere Informationen zum Format dieses Arguments finden Sie in ?attribute.combination in R.

    
Tamás 26.09.2013, 11:29
quelle

Tags und Links