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

如何使用igraph将两个节点合并为一个节点,r,igraph,R,Igraph,我试图将图(G)中的两个节点(称为“V”和“U”)合并为一个节点(V) G是一个由779个节点(网站)组成的超链接网络。每条边代表一个超链接。V和U实际上是同一个网站,但不幸的是,该网站的网页已被分成两个单独的节点。所以我想把它们放回一个节点 我已经研究了contract.vertices函数,但是我不知道如何在这里调整它 下面是我的图(G)的属性 我有两个要合并在一起的节点: > V(g)$id[8] [1] "http://www.police.uk/" 及 图中总共有779个节点和

我试图将图(G)中的两个节点(称为“V”和“U”)合并为一个节点(V)

G是一个由779个节点(网站)组成的超链接网络。每条边代表一个超链接。V和U实际上是同一个网站,但不幸的是,该网站的网页已被分成两个单独的节点。所以我想把它们放回一个节点

我已经研究了contract.vertices函数,但是我不知道如何在这里调整它

下面是我的图(G)的属性

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

> V(g)$id[8]
[1] "http://www.police.uk/"

图中总共有779个节点和3544条边

我希望这两个节点成为图中的单个节点(即,它们将具有相同的“id”)。从/到其他节点的所有内链接和外链接现在将仅指向此新的单个节点


所有其他属性将保持不变,除了
页数
(其值将是合并前两个节点的总和)。

收缩。顶点
确实是可以尝试的正确功能,但是它的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的ID更改为8,节点10的ID更改为9:

c(1,2,3,4,5,6,4,7,8,9)
现在,由于您还希望新节点的
页数
属性是两个旧节点的值之和,因此必须告诉igraph在合并期间如何处理顶点属性。
contract.vertex
vertex.attr.comb
参数用于此目的。在您的情况下,
vertex.attr.comb
的值应该如下所示:

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

其中,
“页数”=“sum”
表示应通过对旧属性值求和来计算
页数
属性的新值,
“first”
表示对于此处未提及的所有其他属性,新值应由合并为单个节点的节点集中第一个节点的旧值确定。有关此参数格式的更多详细信息,请参见R中的
?attribute.composition

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的ID更改为8,节点10的ID更改为9:

c(1,2,3,4,5,6,4,7,8,9)
现在,由于您还希望新节点的
页数
属性是两个旧节点的值之和,因此必须告诉igraph在合并期间如何处理顶点属性。
contract.vertex
vertex.attr.comb
参数用于此目的。在您的情况下,
vertex.attr.comb
的值应该如下所示:

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

其中,
“页数”=“sum”
表示应通过对旧属性值求和来计算
页数
属性的新值,
“first”
表示对于此处未提及的所有其他属性,新值应由合并为单个节点的节点集中第一个节点的旧值确定。有关此参数格式的更多详细信息,请参见R中的
?attribute.composition

能否发布一个简单的可复制示例?@e4f4您好,谢谢您的回复。我有