r - 如何将重复的节点合并为一个节点?
问题描述
这个问题是问题的延续。
我将坐标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
)
我需要将具有重复坐标的节点合并为一个节点。
问题。是否可以将具有重复坐标的节点合并为一个节点?重复的边缘也应该合并到一个边缘。可以省略边缘的方向。
解决方案
跟进我的评论,并通过进一步调查,我设法减少了你的图表。这不是微不足道的,因为我必须通过 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 加入到它们共享的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
...
最后一步是通过其 id 将节点与contract.vertices函数合并。合并后的 dt的gID属性必须作为属性给出,因此它知道必须合并哪些节点。(您可以将其分配给您的g变量 ofc。)
幸运的是,groupID dt 包含正确的绘图布局,因为它具有组(您的坐标)和它们的 id。
现在节点被合并了,但是从合并的顶点到它们的邻居仍然有多个边,之后必须删除它。
转换后的图形如下所示:
对应帖子:
推荐阅读
- html - React Native HTML - 呈现线性背景渐变
- firebase - 在模拟的 Firebase 函数中运行 admin.storage().bucket(..).file(..).move() 时出现未实现的 API 错误
- kotlin - 测试是否调用嵌套方法调用时,Mockito 测试抛出“想要但未调用”
- javascript - 将 Angularjs、Nodejs 和 D3.js 定义为“技术”是否正确?
- python - Sql Location_of_2nd_Max_Logins 逻辑
- reactjs - React js错误:表单标签必须与控件相关联
- php - 在 WooCommerce 产品搜索中启用按 product_tag 搜索
- html - 如何围绕中心对齐 2 x 2 div?例如,内角应该在父中心
- airflow - 气流 schedule_interval,如何放弃这个计划任务
- caliburn.micro - WPF Caliburn.Micro 使用错误的平台提供程序