数组的维度名称是否有标准属性? (例如 3D 数组 -> 3 个名称)

问题描述 投票:0回答:1

[编辑:我认为 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
已经做的事情。

我想我可以只添加一个自定义属性,例如

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
属性:

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 已命名为维度名称,它可以是选择维度名称的字符向量。

所以看起来

names(dimnames(...)) <- ...
是正确的选择!

r arrays attributes
1个回答
0
投票

确实有。

?dimnames
中甚至有一个例子来展示它(我稍作修改):

A <- provideDimnames(array((1:24)+9, dim=4:2))
str(A)
#  num [1:4, 1:3, 1:2] 10 11 12 13 14 15 16 17 18 19 ...
#  - attr(*, "dimnames")=List of 3
#   ..$ : chr [1:4] "A" "B" "C" "D"
#   ..$ : chr [1:3] "A" "B" "C"
#   ..$ : chr [1:2] "A" "B"

A[,,"A"]
#    A  B  C
# A 10 14 18
# B 11 15 19
# C 12 16 20
# D 13 17 21

A[,"A",]
#    A  B
# A 10 22
# B 11 23
# C 12 24
# D 13 25

A["A",,]
#    A  B
# A 10 22
# B 14 26
# C 18 30
© www.soinside.com 2019 - 2024. All rights reserved.