【问题标题】:How do I merge two nodes into a single node using igraph如何使用 igraph 将两个节点合并为一个节点
【发布时间】:2013-09-30 14:55:43
【问题描述】:

我正在尝试将图形 (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 外,所有其他属性都将保持不变(此值将是两个节点合并前的总和)。

【问题讨论】:

  • 你能发布一个简单的可重现的例子吗?
  • @e4e5f4 您好,感谢您的回复。我提供了更多信息。这足以解决这里的问题吗?

标签: r igraph


【解决方案1】:

contract.vertices 确实是一个可以尝试的函数,但它的 API 有点复杂,因为它的设计目的是不仅能够合并一对节点,而且能够一次合并多对节点。 (它也可以置换顶点)。为此,它需要一个从旧顶点 ID 到新顶点 ID 的 映射

如果您不熟悉顶点 ID:igraph 使用 1 到 N 范围内的整数标识图形的每个顶点,其中 N 是顶点数。 contract.vertices 要求的映射必须是一个长度为 N 的列表,其中列表的第 i 个元素包含与 ID i before merging 对应的节点的 new ID .

假设您的图表包含 10 个节点。以下映射向量将简单地将每个节点映射到它已经拥有的相同 ID,因此它不会进行任何合并:

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

现在,假设您要将节点 7 合并到节点 4。您必须告诉 igraph 节点 7 的 new 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 手动删除它,或者您可以指定不同的映射,不仅将节点 7 合并到节点 4,而且将节点 8 的 ID 更改为 7,将节点 9 更改为 8,将节点 10 更改为9:

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

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

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

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

【讨论】:

  • 谢谢,这个解决方案非常有效。我使用了不手动删除旧节点的选项。相反,我按照建议指定了不同的映射(例如 c(1,2,3,4,5,6,4,7,8,9)。
  • @e4e5f4 您的解决方案似乎一切正常,但是新合并的节点(在新图中)现在似乎具有加权度。当我将图表导入 Gephi 时,我注意到了这一点。我不确定发生了什么或如何解决它。
  • 在收缩节点后,您可能最终会在同一节点对之间产生多条边,而 Gephi 将这些边折叠成单个加权边。尝试使用simplify() 简化 igraph 中的图形 - 这应该将多条边折叠成一条边。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-28
  • 2017-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
相关资源
最近更新 更多