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')
由于 names
和 dimnames
函数都是原始函数,因此很难查看源代码。不过,我还是做了一点研究,从this example可以看出,dimnames
和names
指的是一个对象完全不同的属性:
#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
函数的功能并没有消失,只是访问矩阵值的方式不同。
假设我有一个矩阵
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')
由于 names
和 dimnames
函数都是原始函数,因此很难查看源代码。不过,我还是做了一点研究,从this example可以看出,dimnames
和names
指的是一个对象完全不同的属性:
#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
函数的功能并没有消失,只是访问矩阵值的方式不同。