[英]How do I merge two nodes into a single node using igraph
我正在嘗試將圖形(G)中的兩個節點(稱為“ V”和“ U”)合並為一個節點(V)。
G是779個節點(網站)的超鏈接網絡。 每個邊緣代表一個超鏈接。 V和U實際上是同一個網站,但不幸的是,該網站的網頁已分成兩個單獨的節點。 所以我想將它們放回一個節點中。
我已經研究了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)
我有兩個要合並在一起的節點:
> V(g)$id[8]
[1] "http://www.police.uk/"
和
> V(g)$id[14]
[1] "http://police.uk/"
圖中總共有779個節點和3544個邊。
我希望這兩個節點成為圖中的單個節點(即它們將具有相同的“ id”)。 現在,來自/到其他節點的所有入站和出站都將僅指向該新的單個節點。
除“ Number of Pages
”外,所有其他屬性將保持不變(該值將是兩個節點在合並之前的總和)。
contract.vertices
確實是可以嘗試的正確函數,但是它的API有點復雜,因為它被設計為不僅可以在單遍中合並一對節點,而且可以合並幾對節點。 (它也可以置換頂點)。 為此,它需要從舊頂點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中。您必須告訴igraph節點7的新 ID為4,因此必須將上述向量中的第7個元素更改為4:
c(1,2,3,4,5,6,4,8,9,10)
這幾乎可以完成工作; 問題是,需要的igraph節點ID是在范圍為1到N,並且自你還有用ID 10的節點根據上述映射,的igraph不會刪除舊節點7,用戶可以手動與刪除delete.vertices
收縮頂點后的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
屬性為兩個舊節點的值之和,因此必須告訴igraph在合並過程中如何處理頂點屬性。 該vertex.attr.comb
的參數contract.vertices
服務於這一目的。 在您的情況下, vertex.attr.comb
的值應類似於以下內容:
list("Number of Pages"="sum", "first")
其中"Number of Pages"="sum"
表示應通過將舊屬性值相加來計算Number of Pages
屬性的新值, "first"
表示對於此處未提及的所有其他屬性,應將新值設為由合並到單個節點中的一組節點中第一個節點的舊值確定。 有關此參數格式的更多詳細信息,請參見R中的?attribute.combination
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.