2012-07-17 2 views
6

У меня есть таблицы действий различной величины. Я хотел бы проиндексировать их, используя набор значений из набора данных. Однако myTable[c(5,5,5,5)] явно не делает то, что я хочу. Как я могу получить c(5,5,5,5) как myTable[5,5,5,5]?Индексирование многомерной таблицы с использованием вектора-столбца

ответ

3

Вслед на ответ @ ttmaccer: это работает из-за (слегка) неясного абзаца в ?"[", который гласит:

When indexing arrays by ‘[’ a single argument ‘i’ can be a 
matrix with as many columns as there are dimensions of ‘x’; 
the result is then a vector with elements corresponding to 
the sets of indices in each row of ‘i’. 

Эффект использования t(ii) в

ii <- c(5,5,5,5) 
a[t(ii)] 

заключается в преобразовании ii в матрицу 1х4, что [ интерпретирует как матрицу, как описано выше; a[matrix(ii,nrow=1)] будет более явным, но менее компактным.

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

jj <- matrix(c(5,5,5,5, 
       6,6,6,6),byrow=TRUE,nrow=2) 
a[jj] 
## [1] 4445 5556 
+0

Спасибо за расширение на @ ответ ttmacer в , Очень хорошо. –

2

Если я правильно понимаю ваш вопрос, эту конструкцию, используя do.call(), должны делать то, что вы хотите:

## Create an example array and a variable containing the desired index 
a <- array(1:1e4, dim = c(10, 10, 10, 10)) 
ii <- c(5, 5, 5, 5) 

## Use do.call to extract the desired element. 
do.call("[", c(list(a), ii)) 
# [1] 4445 

Вызов выше работает, потому что следующее эквивалентны:

a[5, 5, 5, 5] 
`[`(a, 5, 5, 5, 5) 
do.call("[", list(a, 5, 5, 5, 5)) 
do.call("[", c(list(a), ii)) 
Смежные вопросы