基于成对相等性对列进行分组

jac*_*ger 3 combinations r

我有一个名为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)

我最终会使用此命令的输出来创建映射.这些值本质上是属于同一组的元素的索引.

jos*_*ber 5

考虑这一点的一种方式是图形,其中每个数字是图形中的节点,并且在列中共同出现的两个数字意味着与这两个数字相关联的顶点在图形中共享边缘.对于您的示例,我们可以使用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)