【问题标题】:R adding names attribute to adjacency matrix of a graphR将名称属性添加到图的邻接矩阵
【发布时间】:2021-12-29 14:45:33
【问题描述】:

假设我有一个矩阵

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 

我该如何处理?

【问题讨论】:

  • names for mattrix 是不同的。与dimnames 相比。因为matrix 只是一个带有dim 属性的向量。因此,如果要命名元素,则需要为 length(mat) 提供名称

标签: r matrix graph


【解决方案1】:

让我们首先回顾一下 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&lt;...&gt;() 函数在核心级别具有完全不同的用途和实现。

要通过命名维度访问您的矩阵,只需执行以下操作:

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 "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 函数的功能并没有消失,只是访问矩阵值的方式不同。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多