如何在R中获取数组的列索引矩阵?

时间:2011-07-21 00:34:07

标签: r

想象一下,我在R中有一个简单的4x3x2数组。

> 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" 

3 个答案:

答案 0 :(得分:4)

该功能只是

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

答案 1 :(得分: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)
         }

}

答案 2 :(得分: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))
  })
}