首页 > 解决方案 > 在二维矩阵中查找相互关联的邻居

问题描述

我有一个类似的矩阵如下

  a| b | c | d | e 
1|1| 0 | 0 | 1 | 0
2|0| 0 | 1 | 0 | 1
3|0| 1 | 0 | 0 | 0
4|0| 1 | 0 | 1 | 0
5|0| 1 | 0 | 0 | 0
6|1| 0 | 0 | 0 | 0

我想得到每封信的邻居。邻居定义如下,例如“a”和“d”对于第 1 行是 1,因此它们现在是邻居,“d”对于第 1 行和第 4 行是 1,因此对于第 4 行为 1 的任何字母都将是“d”的邻居以及ASA”。这里“b”是第 4 行的 1,因此将是机器人“a”和“d”的邻居。等等 ...

输出应该是

   a    | b     |  c    |  d    |  e 
   3    | 3     |  2    |  3    |  2
 abd    |abd    |     ce|    abd|     ce
 1,3,4,6|1,3,4,6|    2,5|1,3,4,6|    2,5

其中第二行告诉邻居的数量(包括字母表本身)。第三行告诉邻居第四行告诉连接这些邻居的行名

标签: r

解决方案


正如@Sotos 在评论中提到的,您可以使用包igraph来可视化矩阵,下面的代码只是为了让您了解如何制作它

library(igraph)
M <- crossprod(m)
g <- graph_from_adjacency_matrix(M,mode = "undirected")
plot(g)

你会看到顶点是如何连接的。 在此处输入图像描述

然后,您的预期输出(除了最后一行,因为我不知道您是如何得到它的)可以如下实现:

r <- clusters(g)

vtx <- names(r$membership)
len <- ave(seq(r$membership),r$membership,FUN = length)
cnm <- ave(vtx,r$membership,FUN = function(x) paste0(x,collapse = ","))

dfout <- setNames(as.data.frame(rbind(len,cnm)),vtx)

这样

> dfout
        a     b   c     d   e
len     3     3   2     3   2
cnm a,b,d a,b,d c,e a,b,d c,e

笔记

我认为您的问题可能是集群(不是相邻的),因此您可以使用如下命令:

> cluster_infomap(g)
IGRAPH clustering infomap, groups: 2, mod: 0.38
+ groups:
  $`1`
  [1] "a" "b" "d"

  $`2`
  [1] "c" "e"

或者

> clusters(g)
$membership
a b c d e 
1 1 2 1 2 

$csize
[1] 3 2

$no
[1] 2

数据

m <- structure(c(1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 0L, 
1L, 0L, 0L, 0L, 0L, 1L, 0L, 0L, 1L, 0L, 0L, 0L, 1L, 0L, 0L, 0L, 
0L), .Dim = 6:5, .Dimnames = list(c("1", "2", "3", "4", "5", 
"6"), c("a", "b", "c", "d", "e")))

推荐阅读