gpt4 book ai didi

r - 如何使用igraph将两个节点合并为单个节点

转载 作者:行者123 更新时间:2023-12-04 03:27:55 26 4
gpt4 key购买 nike

我正在尝试将图形(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手动删除它收缩顶点后,或者可以指定不同的映射,不仅将节点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.combcontract.vertices参数用于此目的。在您的情况下, vertex.attr.comb的值应类似于以下内容:
list("Number of Pages"="sum", "first")

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

关于r - 如何使用igraph将两个节点合并为单个节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18997752/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com