2011-07-21 45 views
2

は、私が好きな何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 

に、私はシンプルな4x3x2の配列を持っている想像し、任意の次元の各要素のインデックスの名前を私に戻って与え、アレイ上の単純な関数です。この場合、次元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

それは配列として返されなければならない 'ライブラリは(再構築します? ) –

答えて

4

機能だけ

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

、私は私がうっかりしていたのを見てそれを削除しました。 –

+0

ありがとうございました - 配列の実装に関する知識に頼る経路を避けようとしましたが、これは意図したとおりに動作し、n次元配列にも及んでいます。 – evanrsparks

+0

実装に関する知識に頼るのは問題ではありませんが、何らかの理由でそれを避けたいのであれば、私の答えを見てください。 – Aaron

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)) 
    }) 
} 
関連する問題