2014-02-05 20 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()',那應該沒問題。 –