[编辑:我认为 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(...)) <- ...
是正确的选择!
确实有。
?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