12

我正在尝试将图形(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( this 的值将是两个节点在合并之前的总和)。

4

1 回答 1

18

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 不会删除delete.vertices旧节点 7。您可以使用after手动删除它您收缩了顶点,或者您可以指定不同的映射,不仅将节点 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"意味着对于此处未提及的所有其他属性,新值应由节点集合中第一个节点的旧值确定合并为一个。有关此参数格式的更多详细信息,请参阅?attribute.combinationR。

于 2013-09-26T11:29:39.757 回答