2016-07-19 2 views
0

Я испытываю некоторое странное поведение в R при попытке индексировать матрицу с другой матрицей. Я столкнулся с ошибкой индекса за пределами индексации с помощью 2-х столбчатой ​​матрицы, но не с четырьмя столбцами матрицы. См. Следующий воспроизводимый код. Любое понимание будет оценено!Индексирование матрицы с другой матрицей в R - индекс за пределами

Это

data <- matrix(rbinom(100, 1, .5), nrow = 10) 
idx <- cbind(1:50, 51:100) 
data[idx] 

приводит:

Error in data[idx] : subscript out of bounds 

Однако

data[cbind(idx,idx)] 

работы.

Моя информация сессии:

R version 3.3.1 (2016-06-21) 
Platform: x86_64-apple-darwin15.5.0 (64-bit) 
Running under: OS X 10.11.5 (El Capitan) 
+0

Ну, 'data' имеет 10 строк и 10 столбцов. 'idx' имеет значения, которые достигают 100. Например, первая строка' idx' равна '1 51', что указывает на 1-й и 51-й столбцы. Поскольку 'data' имеет только 10 столбцов, 51-й столбец действительно выходит за пределы. Если вы вместо этого используете либо (a) 'idx = cbind (1: 5, 6:10)', либо (b) 'data = matrix (rbinom (100^2, 1. 0.5), nrow = 100)', то ваш код будет работать. – Gregor

+0

'idx' сам относится к полной матрице, содержащей номера от 1 до 100.' data' является матрицей 10 на 10, поэтому оба индекса в пределах от 1 до 10 не будут приводить к ошибке. Однако, как только вы начнете ссылаться на цифры, превышающие 10, у вас будет ошибка индекса. Попробуйте 'data [idx [2,2]]' –

ответ

2

Ключом понимание, почему это неправильно не работает дается в ?'[':

При индексации массивов по [ один аргумент i может быть матрица с таким количеством столбцов, как размеры x; результатом является вектор с элементами, соответствующими наборам индексов в каждой строке i.

, и это ясно, когда возникает ошибка нижнего индекса; data не имеет 50 строк и 100 столбцов.

Что происходит во втором примере, матрица индексирования просто обрабатывается как вектор, поскольку она содержит больше столбцов, чем индексированная матрица, имеет размеры и извлекает элементы c(1:100, 1:100) из data.

Это легко увидеть с

m <- matrix(1:100, ncol = 10, byrow = TRUE) 

и индексации с cbind(idx, idx) дает

> m[cbind(idx,idx)] 
    [1] 1 11 21 31 41 51 61 71 81 91 2 12 22 32 42 52 62 72 
[19] 82 92 3 13 23 33 43 53 63 73 83 93 4 14 24 34 44 54 
[37] 64 74 84 94 5 15 25 35 45 55 65 75 85 95 6 16 26 36 
[55] 46 56 66 76 86 96 7 17 27 37 47 57 67 77 87 97 8 18 
[73] 28 38 48 58 68 78 88 98 9 19 29 39 49 59 69 79 89 99 
[91] 10 20 30 40 50 60 70 80 90 100 1 11 21 31 41 51 61 71 
[109] 81 91 2 12 22 32 42 52 62 72 82 92 3 13 23 33 43 53 
[127] 63 73 83 93 4 14 24 34 44 54 64 74 84 94 5 15 25 35 
[145] 45 55 65 75 85 95 6 16 26 36 46 56 66 76 86 96 7 17 
[163] 27 37 47 57 67 77 87 97 8 18 28 38 48 58 68 78 88 98 
[181] 9 19 29 39 49 59 69 79 89 99 10 20 30 40 50 60 70 80 
[199] 90 100 

, которая является такой же, как

m[c(idx[,1], idx[,2], idx[,1], idx[,2])] 

или конкретно,

m[c(1:50, 51:100, 1:50, 51:100)] 
Смежные вопросы