如何将重复的节点合并为一个节点?

时间:2019-05-08 11:04:48

标签: r merge igraph

这个问题是question的继续。

我有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
)

enter image description here

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

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

1 个答案:

答案 0 :(得分:1)

根据我的评论进行进一步的调查,我设法减少了您的图表。这不是小事,因为我必须通过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对于每个组,由坐标的唯一组合创建(每个[-2,0]有一个ID,每个[0,0]等都有一个ID)

所以 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加入到我之前刚刚改名的共享的 X Y 列上。

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
...

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

幸运的是, groupID dt包含适用于您绘图的正确布局,因为它具有组(您的坐标)及其ID。

现在,节点已合并,但是从合并的顶点到其相邻节点仍存在多个边,之后必须将其删除。

转换后,图形如下所示:

graph with merged nodes

对应帖子: