我有一个名为equalityMatrix的矩阵
> equalityMatrix
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18]
[1,] 29 29 29 29 55 55 55 55 101 101 101 111 111 115 134 134 134 151
[2,] 101 111 115 316 134 151 235 319 111 115 316 115 316 316 151 235 319 235
[,19] [,20]
[1,] 151 235
[2,] 319 319
Run Code Online (Sandbox Code Playgroud)
(做你的:)
structure(c(29L, 101L, 29L, 111L, 29L, 115L, 29L, 316L, 55L,
134L, 55L, 151L, 55L, 235L, 55L, 319L, 101L, 111L, 101L, 115L,
101L, 316L, 111L, 115L, 111L, 316L, 115L, 316L, 134L, 151L, 134L,
235L, 134L, 319L, 151L, 235L, 151L, 319L, 235L, 319L), .Dim = c(2L,
20L))
Run Code Online (Sandbox Code Playgroud)
这表示元件29等于元件101,111,115和316; 元素55等于元素134,151,235和319; 等等等等.
如何有效地获得如下所示的相等元素列表?
[[1]]
[1] 29 101 111 115 316
[[2]]
[1] 55 134 151 235 319
Run Code Online (Sandbox Code Playgroud)
我最终会使用此命令的输出来创建映射.这些值本质上是属于同一组的元素的索引.
考虑这一点的一种方式是图形,其中每个数字是图形中的节点,并且在列中共同出现的两个数字意味着与这两个数字相关联的顶点在图形中共享边缘.对于您的示例,我们可以使用igraph包来创建包含您的数据的图形:
library(igraph)
g <- graph.data.frame(t(equalityMatrix))
plot(g)
Run Code Online (Sandbox Code Playgroud)
图表的组成部分将是相同的数字:
split(as.numeric(V(g)$name), components(g)$membership)
# $`1`
# [1] 29 101 111 115 316
#
# $`2`
# [1] 55 134 151 235 319
Run Code Online (Sandbox Code Playgroud)