根据成对相等对列进行分组

Grouping columns based on pairwise equality

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

(做你的:)

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

这表示元素29等于元素101、111、115和316;元素 55 等于元素 134、151、235 和 319;等等等等。

如何有效地获取如下所示的相等元素列表?

[[1]]
[1] 29 101 111 115 316

[[2]]
[1] 55 134 151 235 319

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

像这样:

library(dplyr)

equalityMatrix %>%
  t %>%
  as.data.frame %>%
  setNames(c("group", "value")) %>%
  group_by(group) %>%
  summarize(value = list(value))

可以将其视为一个图形,其中每个数字都是图形中的一个节点,并且列中同时出现的两个数字意味着与这两个数字关联的顶点在图形中共享一条边。对于您的示例,我们可以使用 igraph 包来创建包含您的数据的图表:

library(igraph)
g <- graph.data.frame(t(equalityMatrix))
plot(g)

图表的组成部分将是相等的数字:

split(as.numeric(V(g)$name), components(g)$membership)
# $`1`
# [1]  29 101 111 115 316
# 
# $`2`
# [1]  55 134 151 235 319