2014-02-05 22 views
2

我想获得给定向量,矩阵或数组的每个维度的名称。例如:获取实际暗淡名称的函数()

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

我不认为有内置基地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)) 
+0

工程就像一个魅力,谢谢。 –

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#的空COALESCE操作,或or在Perl和Ruby,PHP ...:

`%else%` = function (a, b) if (identical(a, FALSE) || is.null(a) || length(a) == 0) b else a 
+0

我喜欢'%else%',你可能想添加一个'FALSE'子句:'x = F%else%print(“this is working”)' –

+0

不完全一样,因为你的函数只能用于'matrix '但是我们也想得到'vector'的结果。顺便说一下,这个%else%函数真的很方便 – dickoa

+0

和'table'和其他奇怪的数据类型。所以我在开始时调用了一个'as.array()',那应该没问题。 –