R将名称属性添加到图形的邻接矩阵

R adding names attribute to adjacency matrix of a graph

假设我有一个矩阵

mat <- matrix(1, nrow = 5, ncol = 5)
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    1    1    1
[2,]    1    1    1    1    1
[3,]    1    1    1    1    1
[4,]    1    1    1    1    1
[5,]    1    1    1    1    1

是图的邻接矩阵。我需要添加一个带有顶点名称的属性 names,因此在本例中为 c('1', '2', '3', '4', '5')。如果我只是给这些顶点命名,我会简单地选择

rownames(mat) <- c('1', '2', '3', '4', '5')
colnames(mat) <- c('1', '2', '3', '4', '5')

但这不会更改 names 属性。 写作

names(mat) <- c('1', '2', '3', '4', '5')

显然更改了前 5 个元素的“名称”

 [1] "1" "2" "3" "4" "5" NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA  NA 
[21] NA  NA  NA  NA  NA 

我该如何处理?

让我们首先回顾一下R中的矩阵是什么。比如说,您有以下矩阵定义:

mat <- matrix(1, nrow = 5, ncol = 5)

这与您写的一样:

mat <- rep(1, each=25)
dim(mat) <- c(5, 5)

现在,如果您想为行和列命名,可以通过多种方式实现:

dimnames(mat) <- list(
  c('r1', 'r2', 'r3', 'r4', 'r5'),
  c('c1', 'c2', 'c3', 'c4', 'c5')
)

# or:

rownames(mat) <- c('r1', 'r2', 'r3', 'r4', 'r5')
colnames(mat) <- c('c1', 'c2', 'c3', 'c4', 'c5')

由于 namesdimnames 函数都是原始函数,因此很难查看源代码。不过,我还是做了一点研究,从this example可以看出,dimnamesnames指的是一个对象完全不同的属性:

#define GET_DIMNAMES(x)     Rf_getAttrib(x, R_DimNamesSymbol)
#define GET_NAMES(x)        Rf_getAttrib(x, R_NamesSymbol)

上面的一切清楚地表明 names()dim<...>() 函数在核心级别上具有完全不同的目的和实现。

要按命名维度访问矩阵,只需执行以下操作:

mat["r5", "c2"]

如果你想命名你的向量/矩阵的每个值,你可能想做这样的事情:

names(mat) <- c('v1', 'v2', 'v3', ..., 'v25')

# or:

names(mat) <- paste0(rep('v', each=25), 1:25)

# access the vertex:

print(mat['v25'])

这会起作用,因为正如我在介绍矩阵定义方式的示例中向您展示的那样,matrix 继承了 vector class:

Class "matrix" [package "methods"]

...

Extends: 
Class "array", directly
Class "structure", by class "array", distance 2
Class "vector", by class "array", distance 3, with explicit coerce

names函数的功能并没有消失,只是访问矩阵值的方式不同。