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
相关产品推荐
相关产品推荐

