我有这样一个矩阵:


1 0 1 0 1 1
1 1 1 0 0 1
1 0 1 1 1 1
0 0 0 1 0 0
0 1 1 1 0 1
1 1 0 1 1 1

其中1表示一个 node ,0表示没有 node ,因此,例如从(1,1)我们可以转到(2,1),从(2,1)我们可以转到(3,1)或(2,2),依此类推.

图是无向的,所有的边都有相同的代价(只说代价为1)

我们总共有23个 node ,所以邻接矩阵应该是一个23x23的矩阵,它有1个,告诉我们两个 node 是连接的.

有没有办法用R把这个矩阵转换成图的邻接矩阵?

推荐答案

创建一个数据框,其中矩阵的每个条目有一行以及相应的行和列编号,然后将该数据框细分为1个条目.(@Andrew Gustar删除了他的帖子,但该帖子显示d的行和列也可以表示为d <- as.data.frame(which(m == 1, arr.ind = TRUE))).现在使用outer来确定该数据帧的两行是否表示相邻 node .将==1更改为<=1在设置adj if node 可以与其相邻的行中.

d <- data.frame(value = c(m), row = c(row(m)), col = c(col(m))) |>
  subset(value == 1)
adj <- +with(d, abs(outer(row, row, `-`)) + abs(outer(col, col, `-`)) == 1)

通过将邻接矩阵转换为稀疏矩阵,可以方便地查看邻接矩阵.

Matrix::Matrix(adj)

给:

23 x 23 sparse Matrix of class "dsCMatrix"   
                                            
 [1,] . 1 . . . . . . . . . . . . . . . . . . . . .
 [2,] 1 . 1 . 1 . . . . . . . . . . . . . . . . . .
 [3,] . 1 . . . . . . . . . . . . . . . . . . . . .
 [4,] . . . . . . 1 . . . . . . . . . . . . . . . .
 [5,] . 1 . . . . . . 1 . . . . . . . . . . . . . .
 [6,] . . . . . . 1 . . . 1 . . . . . . . . . . . .
 [7,] . . . 1 . 1 . . . . . . . . . . . . . . . . .
 [8,] . . . . . . . . 1 . . . . . . . . . . . . . .
 [9,] . . . . 1 . . 1 . 1 . . . . . . . . . . . . .
[10,] . . . . . . . . 1 . . 1 . . . . . . . . . . .
[11,] . . . . . 1 . . . . . . . 1 . . . . . . . . .
[12,] . . . . . . . . . 1 . . 1 . . . 1 . . . . . .
[13,] . . . . . . . . . . . 1 . 1 . . . . . . . . .
[14,] . . . . . . . . . . 1 . 1 . 1 . . . . . . . .
[15,] . . . . . . . . . . . . . 1 . . . 1 . . . . .
[16,] . . . . . . . . . . . . . . . . . . 1 . . . .
[17,] . . . . . . . . . . . 1 . . . . . . . . 1 . .
[18,] . . . . . . . . . . . . . . 1 . . . . . . . 1
[19,] . . . . . . . . . . . . . . . 1 . . . 1 . . .
[20,] . . . . . . . . . . . . . . . . . . 1 . 1 . .
[21,] . . . . . . . . . . . . . . . . 1 . . 1 . . .
[22,] . . . . . . . . . . . . . . . . . . . . . . 1
[23,] . . . . . . . . . . . . . . . . . 1 . . . 1 .

我们可以使用igraph来绘制图形:

library(igraph)

set.seed(123)
g <- graph.adjacency(adj, mode = "undirected")
plot(g, vertex.color = "white", vertex.size = 10, vertex.label.cex = 0.7)

screenshot

笔记

m <- structure(c(1, 1, 1, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 1, 1, 0, 1, 
0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1, 1, 0, 1, 1), .Dim = c(6L, 
6L), .Dimnames = list(NULL, NULL))

R相关问答推荐

使用sensemakr和fixest feols模型(R)

基于shiny 应用程序中的日期范围子集xts索引

在(g)子中使用asserable字符

MCMC和零事件二元逻辑回归

如果行和大于值,则过滤

为什么横向页面会导致officeverse中的页码/节头/页脚出现问题?

我不能在docker中加载sf

将. xlsx内容显示为HTML表

如何用书面利率绘制geom_bar图

在列表中排列R数据框中的列顺序

在R中创建连续的期间

警告消息";没有非缺失的参数到min;,正在返回数据中的inf";.表分组集

在gggraph中显示来自不同数据帧的单个值

如何删除R中除数字元素以外的所有元素

向R中的数据帧添加一列,该列统计另一列中每个唯一值的二进制观测值的数量

SHILINY中DT列的条件着色

基于R中的辅助向量中的值有条件地连接向量中的字符串

计算多变量的加权和

如何编辑被动式数据表?

如果缺少时间,如何向日期-时间列添加时间