[英]How do I merge two nodes into a single node using 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)
我有两个要合并在一起的节点:
> 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
收缩顶点后的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.comb
的参数contract.vertices
服务于这一目的。 在您的情况下, vertex.attr.comb
的值应类似于以下内容:
list("Number of Pages"="sum", "first")
其中"Number of Pages"="sum"
表示应通过将旧属性值相加来计算Number of Pages
属性的新值, "first"
表示对于此处未提及的所有其他属性,应将新值设为由合并到单个节点中的一组节点中第一个节点的旧值确定。 有关此参数格式的更多详细信息,请参见R中的?attribute.combination
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.