Ключом понимание, почему это неправильно не работает дается в ?'['
:
При индексации массивов по [
один аргумент 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)]
Ну, '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
'idx' сам относится к полной матрице, содержащей номера от 1 до 100.' data' является матрицей 10 на 10, поэтому оба индекса в пределах от 1 до 10 не будут приводить к ошибке. Однако, как только вы начнете ссылаться на цифры, превышающие 10, у вас будет ошибка индекса. Попробуйте 'data [idx [2,2]]' –