2010-07-09 2 views
2

У меня есть X, трехмерный массив в R. Я хочу взять вектор индексов indx (длина равна dim(X)[1]) и сформировать матрицу, где первая строка является первой строка X[ , , indx[1]], вторая строка - вторая строка X[ , , indx[2]] и т. д.Матрица форм из рядов в 3-мерном массиве

К примеру, у меня есть:

R> X <- array(1:18, dim = c(3, 2, 3)) 
R> X 
, , 1 

    [,1] [,2] 
[1,] 1 4 
[2,] 2 5 
[3,] 3 6 

, , 2 

    [,1] [,2] 
[1,] 7 10 
[2,] 8 11 
[3,] 9 12 

, , 3 

    [,1] [,2] 
[1,] 13 16 
[2,] 14 17 
[3,] 15 18 

R> indx <- c(2, 3, 1) 

Мой требуемый выход

R> rbind(X[1, , 2], X[2, , 3], X[3, , 1]) 
    [,1] [,2] 
[1,] 7 10 
[2,] 14 17 
[3,] 3 6 

В настоящее время я использую безвкусный (и медленно) sapply(1:dim(X)[2], function(x) X[cbind(1:3, x, indx)]). Есть ли способ сделать это, используя встроенные функции индексирования? Мне не повезло экспериментировать с методами индексирования матриц, описанными в ?Extract, но я могу просто ошибаться.

+0

См. Также http://stackoverflow.com/q/3551955/210673 – Aaron

ответ

2

Может быть, как это:

t(sapply(1:3,function(x) X[,,idx][x,,x])) 
1

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

do.call(rbind, lapply(1:dim(X)[1], function(i) X[i, , indx[i]]))

1

Матрица индексации на помощь! Нет apply s необходимо.

Выяснить, какие индексы вы хотите:

n <- dim(X)[2] 
foo <- cbind(rep(seq_along(indx),n), 
      rep(seq.int(n), each=length(indx)), 
      rep(indx,n)) 

(результат этого)

 [,1] [,2] [,3] 
[1,] 1 1 2 
[2,] 2 1 3 
[3,] 3 1 1 
[4,] 1 2 2 
[5,] 2 2 3 
[6,] 3 2 1 

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

> matrix(X[foo],ncol=n) 
    [,1] [,2] 
[1,] 7 10 
[2,] 14 17 
[3,] 3 6 
Смежные вопросы