r - 在二维矩阵中查找相互关联的邻居
问题描述
我有一个类似的矩阵如下
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
其中第二行告诉邻居的数量(包括字母表本身)。第三行告诉邻居第四行告诉连接这些邻居的行名
解决方案
正如@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")))
推荐阅读
- discord.js - 试图找到一种不和谐机器人可以在给定频道中随机发送消息的方法
- automation - Terraform for_each 循环。无效索引
- wordpress - Wordpress 网站 - 重定向过多 - URL 中的数字
- javascript - 如何阻止在js中点击提交按钮的可能性?
- c# - 在查找表上捕获审计日志数据的 C# 常见做法
- java - 使用 Jackson 动态自定义从 Spring Boot REST 服务返回的 JSON
- python-3.x - 脚本停止运行按钮
- javascript - Svelte:如何手动停止订阅?
- django - Django:试图分页列表视图,我得到一个不可散列的类型切片错误
- php - 使用 Symfony 作为后端并得到 CORS 错误