获取实际dimnames的函数()

时间:2014-02-05 16:21:07

标签: r multidimensional-array names

我想得到给定矢量,矩阵或数组的每个维度的名称。类似的东西:

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()给出的。

有没有办法做到这一点?

2 个答案:

答案 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