Форма матрицы из строк в 3-мерном массиве - PullRequest
2 голосов
/ 09 июля 2010

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

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

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, но я могу просто ошибиться.

Ответы [ 3 ]

2 голосов
/ 09 июля 2010

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

t(sapply(1:3,function(x) X[,,idx][x,,x]))
1 голос
/ 07 июня 2011

Матричная индексация на помощь!Не нужно apply с.

Определите, какие индексы вы хотите:

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
1 голос
/ 09 июля 2010

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

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

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