2011-07-21 38 views
2

想象我有一個簡單的4x3x2陣列R.如何獲得R中數組的列索引矩陣?

> x <- array(1:24,c(4,3,2), dimnames=list(c('a','b','c','d'),c('x','y','z'),1:2)) 
> x 
, , 1 

    x y z 
a 1 5 9 
b 2 6 10 
c 3 7 11 
d 4 8 12 

, , 2 

    x y z 
a 13 17 21 
b 14 18 22 
c 15 19 23 
d 16 20 24 

我想要什麼,是陣列上的簡單的功能,讓我回每個元素的任意維度索引的名稱。在這種情況下,尺寸2.

功能將這樣的表現:

> arraydims(x,2) #Where 2 is dimension I want names for. 

, , 1 

    [,1] [,2] [,3] 
[1,] "x" "y" "z" 
[2,] "x" "y" "z" 
[3,] "x" "y" "z" 
[4,] "x" "y" "z" 

, , 2 

    [,1] [,2] [,3] 
[1,] "x" "y" "z" 
[2,] "x" "y" "z" 
[3,] "x" "y" "z" 
[4,] "x" "y" "z" 
+0

是否必須作爲一個數組返回'庫(重塑)''y < - subset(melt(x),X3 == 2)' –

回答

4

的功能僅僅是

colmtx <- function(x, n) { return(array( 
        rep(dimnames(x)[[n]], each=prod(dim(x)[0:(n-1)])), 
        dim=dim(x))) } 
+0

+1 - 是的,這是我的答案,這是真正正確的版本!) – joran

+0

我也有一個不正確的答案了幾分鐘, ,但是當我看到我瘋狂時刪除了它。 –

+0

謝謝 - 正試圖避免依賴數組實現的知識的路線,但這是按預期工作並擴展到n維數組。 – evanrsparks

0

我想這樣的作品如預期。我的編碼可能有點狡猾,可能會有更直接的解決方案。

arraydims <- function(arrname,arrdim) { 

#rows 

if(arrdim==1) { 
arrname[,,] <- dimnames(arrname)[[1]] 
print(arrname) 
     } 

#columns 

if(arrdim==2) { 
arrname[,,] <- rep(dimnames(arrname)[[2]],each=dim(arrname)[1]) 
print(arrname) 
     } 

#tables 

if(arrdim==3) { 
arrname[,,] <- rep(dimnames(arrname)[[3]],each=dim(arrname)[1]*dim(arrname)[2]) 
print(arrname) 
     } 

} 
0

這是另一種方法。它得到了所有尺寸的名字在一次(儘管這可以改變的。?我做了這樣的說法,因爲which返回的所有索引反正

arraydims <- function(x) { 
    x[] <- 1 
    idx <- which(x==1, arr.ind=TRUE) 
    lapply(1:ncol(x), function(k) { 
    array(dimnames(x)[[k]][idx[,k]], dim(x), dimnames=dimnames(x)) 
    }) 
}