You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R语言:数组维度名称是否有标准属性?哪种方案更优?

为R数组的维度命名的标准方式

[编辑:我认为R本身给出了答案;详见下文。]

假设我有一个如下的3D数组:

myarray <- array(1:8, dim=c(2,2,2), dimnames=list(letters[1:2], letters[3:4], letters[5:6]))
myarray
## , , e
##   c d
## a 1 3
## b 2 4
##
## , , f
##   c d
## a 5 7
## b 6 8

我想要为它的三个维度命名,例如'X'、'Y'、'Z'。请注意这与dimnames的作用不同,dimnames是为每个维度的取值命名。

两种实现方案

方案一:添加自定义属性dimensions

通过给数组添加自定义属性存储维度名称:

attr(myarray, 'dimensions') <- c('X','Y','Z')

str(myarray)
## int [1:2, 1:2, 1:2] 1 2 3 4 5 6 7 8
## - attr(*, "dimnames")=List of 3
##  ..$ : chr [1:2] "a" "b"
##  ..$ : chr [1:2] "c" "d"
##  ..$ : chr [1:2] "e" "f"
## - attr(*, "dimensions")= chr [1:3] "X" "Y" "Z"

方案二:为dimnames属性命名

直接给dimnames列表添加名称,以此标记各个维度:

names(dimnames(myarray)) <- c('X', 'Y', 'Z')

str(myarray)
## int [1:2, 1:2, 1:2] 1 2 3 4 5 6 7 8
## - attr(*, "dimnames")=List of 3
##  ..$ X: chr [1:2] "a" "b"
##  ..$ Y: chr [1:2] "c" "d"
##  ..$ Z: chr [1:2] "e" "f"

问题与结论

我的问题是:R中是否已有专门用于此的标准属性?如果没有,上述两种方案各有什么优劣?是否有更好的实现方式?谢谢!

编辑: 举个应用场景,我们可能需要对数组的部分维度使用apply函数,使用字符型维度名称能让操作更友好。例如,myarray是包含'X'、'Y'、'Z'三个变量的频率数组,我们可能需要得到'X'和'Z'的边际频率,即边缘化'Y':

indices <- match(c('X','Z'), names(dimnames(myarray)))

apply(myarray, indices, sum)
##    Z
## X   e  f
##   a 4 12
##   b 6 14

编辑2: apply函数的帮助文档中关于MARGIN参数提到:

当X有命名的dimnames时,可以使用字符向量选择维度名称。

因此,names(dimnames(...)) <- ...是推荐的实现方式!

内容的提问来源于stack exchange,提问作者pglpm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 08:30:03