首页 > 解决方案 > 如何将重复的节点合并为一个节点?

问题描述

这个问题是问题的延续

我将坐标n(x, y)组织在矩阵中,如下所示:

A <- t(matrix(c(
 0, 0, 1, 0, 1,-1, 1,-2, 0,-2,-1,-2,-2,-2,-2,-1,-1,-1, 0,-1, 0, -2, 0,-3,
 0,-4,-1,-4,-1,-3,-1,-2, 0,-2, 1,-2, 2,-2, 2,-3, 1,-3, 0,-3, 0,-2, 0,-1, 0, 0), nrow =2)); 

如您所见,k=8对具有重复的(x,y)坐标。

编辑。

ids <- which(duplicated(A))
k <- length(ids)

我创建了 igraph 对象g并绘制它。具有重复坐标的节点在图中用红色表示。有的重复两次,有的重复三四次。

library(igraph)
g <- make_empty_graph(n=nrow(A)) 
g <- g + path(seq_len(nrow(A))) 

V(g)$id    <- seq_len(vcount(g))
V(g)[V(g)$id %in% ids]$color <- "red"


plot(g, layout=as.matrix(A),
     edge.arrow.size = 0.3,
     edge.curved = TRUE
)

在此处输入图像描述

我需要将具有重复坐标的节点合并为一个节点。

问题。是否可以将具有重复坐标的节点合并为一个节点?重复的边缘也应该合并到一个边缘。可以省略边缘的方向。

标签: rmergeigraph

解决方案


跟进我的评论,并通过进一步调查,我设法减少了你的图表。这不是微不足道的,因为我必须通过 ID 向量明确告诉 igraph 我要合并哪些节点,即:如果您有四个 ID 为 c(1,2,3,4) 的节点并且您想合并第一个其中三个,您必须提供以下 id 向量:c(1,1,1,2)。

我也使用了data.table库,因为我更熟悉它的语法。

我使用的代码:

dt <- as.data.table(A)
groupID <- dt[,.(gID = .GRP),by = list(dt$V1,dt$V2)]
colnames(dt) <- c('X','Y')
colnames(groupID) <- c('X','Y','gid')

dt[groupID, gID := i.gid, on = c(X = 'X', Y = 'Y')]

plot(contract.vertices(g,dt$gID),layout = as.matrix(groupID))

我将给定的m矩阵转换为 data.table,然后为组标识符创建了另一个 dt ( data.table ),因此每个组都有一个单独的 id,由坐标的唯一组合创建(你有一个 id每个 [-2,0],每个 [0,0] 另一个,等等)

所以groupID dt 看起来像这样:

     X  Y gid
 1:  0  0   1
 2:  1  0   2
 3:  1 -1   3
 4:  1 -2   4
 5:  0 -2   5
 6: -1 -2   6
 7: -2 -2   7
 8: -2 -1   8
 9: -1 -1   9
10:  0 -1  10
11:  0 -3  11
12:  0 -4  12
13: -1 -4  13
14: -1 -3  14
15:  2 -2  15
16:  2 -3  16
17:  1 -3  17

在此之后,我刚刚重命名了列以进行进一步的转换。

下一步是将两个 dts 加入到它们共享的XY列上,我刚刚给了一个新名称。

dt现在看起来像这样:

     X  Y gID
 1:  0  0   1
 2:  1  0   2
 3:  1 -1   3
 4:  1 -2   4
 5:  0 -2   5
 6: -1 -2   6
 7: -2 -2   7
 8: -2 -1   8
 9: -1 -1   9
10:  0 -1  10
11:  0 -2   5
12:  0 -3  11
13:  0 -4  12
14: -1 -4  13
...

最后一步是通过其 id 将节点与contract.vertices函数合并。合并后的 dt的gID属性必须作为属性给出,因此它知道必须合并哪些节点。(您可以将其分配给您的g变量 ofc。)

幸运的是,groupID dt 包含正确的绘图布局,因为它具有组(您的坐标)和它们的 id。

现在节点被合并了,但是从合并的顶点到它们的邻居仍然有多个边,之后必须删除它。

转换后的图形如下所示:

具有合并节点的图

对应帖子:


推荐阅读