2016-07-19 3 views
0

他の行列を使って行列を索引付けしようとすると、Rで奇妙な動作が起こります。私は、2列の行列を使ってインデックスを付けることで、範囲外の添え字のエラーにぶつかりますが、4列の行列ではありません。再現可能なコードを参照してください。どんな洞察にも感謝します!他の行列を使った行列の索引付け - 範囲外の索引

でこの

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列がありません。

2番目の例では、索引付けされている行列よりも多くの列が次元を持ち、から要素c(1:100, 1:100)を抽出しているため、索引付け行列はベクトルとして処理されています。 cbind(idx, idx)は、具体的

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

又は同じである

> 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 <- matrix(1:100, ncol = 10, byrow = TRUE) 

とインデックスで参照される

m[c(1:50, 51:100, 1:50, 51:100)]