Как получить индекс столбца матрицы массива в R? - PullRequest
2 голосов
/ 21 июля 2011

Представьте, что у меня есть простой массив 4x3x2 в 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" 

Ответы [ 3 ]

4 голосов
/ 21 июля 2011

Функция просто

colmtx <- function(x, n) {  return( array( 
                   rep(dimnames(x)[[n]], each=prod(dim(x)[0:(n-1)])), 
                   dim=dim(x) ) ) }
0 голосов
/ 21 июля 2011

Вот еще один способ сделать это.Он получает имена для всех измерений одновременно (хотя это можно изменить; я так и сделал, потому что 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))
  })
}
0 голосов
/ 21 июля 2011

Я думаю, что это работает как задумано.Мое кодирование, вероятно, в лучшем случае немного хитроумно, и вполне может быть более простое решение.

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)
         }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...