如何使用igraph将两个节点合并为一个节点

tim*_*ham 10 r 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)
Run Code Online (Sandbox Code Playgroud)

我有两个节点要合并在一起:

> V(g)$id[8]
[1] "http://www.police.uk/"
Run Code Online (Sandbox Code Playgroud)

> V(g)$id[14]
[1] "http://police.uk/"
Run Code Online (Sandbox Code Playgroud)

总共有779个节点和3544个边缘.

我希望这两个节点成为图中的单个节点(即它们将具有相同的"id").来自/到其他节点的所有链接和外链现在将仅指向这个新的单个节点.

除了Number of Pages(它的值将是合并之前的两个节点的总和)之外,所有其他属性将保持不变.

Tam*_*más 14

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)
Run Code Online (Sandbox Code Playgroud)

现在,假设您要将节点7合并到节点4.您必须告诉igraph 节点7 的 ID将是4,因此您必须将上面向量中的第7个元素更改为4:

c(1,2,3,4,5,6,4,8,9,10)
Run Code Online (Sandbox Code Playgroud)

几乎可以胜任这项工作; 问题是,需要的igraph节点ID是在范围为1到N,并且自你还有用ID 10的节点根据上述映射,的igraph不会删除旧节点7,用户可以手动与删除delete.vertices后您收缩了顶点,或者您可以指定不同的映射,不仅将节点7合并到节点4,还将节点8的ID更改为7,将节点9更改为8,将节点10更改为9:

c(1,2,3,4,5,6,4,7,8,9)
Run Code Online (Sandbox Code Playgroud)

现在,由于您还希望Number of Pages新节点的属性是两个旧节点的值的总和,您必须告诉igraph在合并期间如何处理顶点属性.用于此目的的vertex.attr.comb参数contract.vertices.在你的情况下,值vertex.attr.comb应该是这样的:

list("Number of Pages"="sum", "first")
Run Code Online (Sandbox Code Playgroud)

where "Number of Pages"="sum"表示Number of Pages属性的新值应该通过对旧属性值求和来计算,并且"first"意味着对于此处未提及的所有其他属性,新值应该由该节点集中的第一个节点的旧值确定.被合并为一个.有关?attribute.combination此参数格式的更多详细信息,请参阅R.