当我尝试使用另一个矩阵索引矩阵时,我在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 :(得分: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)]