我想得到给定矢量,矩阵或数组的每个维度的名称。类似的东西:
a = matrix(1, nrow=2, ncol=2, dimnames=list(c('a','b'),c('x','y')))
dimnames(a)
# [[1]]
# [1] "a" "b"
#
# [[2]]
# [1] "x" "y"
到目前为止,这么好。如果维度没有任何名称,则应返回NULL:
b = c(1:5)
dimnames(b)
# NULL
也工作正常。但是,当我这样做时:
a2 = matrix(1, nrow=2, ncol=2)
dimnames(a2)
# NULL
这会产生NULL
,即使有两个轴名称每个 NULL
。因此我希望结果是:
# [[1]]
# NULL
# [[2]]
# NULL
而不是 dimnames()
给出的。
有没有办法做到这一点?
答案 0 :(得分:2)
我认为基础R没有内置任何东西。但是编写自己的东西相当容易:
dimnames2 <- function(x) {
if (is.vector(x)) {
list(names(x))
} else {
d <- dimnames(x)
if (is.null(d)) {
rep(list(NULL), length(dim(x)))
} else {
d
}
}
}
dimnames2(1:10)
dimnames2(matrix(1:10))
答案 1 :(得分:1)
这是一个基本完成哈德利正在做的事情(独立派生,我发誓; - )):
> dimnames2 = function (x) dimnames(x) %else% rep(list(NULL), length(dim(x)))
> dimnames2(a)
[[1]]
[1] "a" "b"
[[2]]
[1] "x" "y"
> dimnames2(a2)
[[1]]
NULL
[[2]]
NULL
是的,我被骗了。 %else%
等同于C#中的null-coalesce运算符,或者Perl,Ruby,PHP中的or
...:
`%else%` = function (a, b) if (identical(a, FALSE) || is.null(a) || length(a) == 0) b else a