使用R中的另一个矩阵索引矩阵 - 索引越界

时间:2016-07-19 21:45:56

标签: r matrix

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

1 个答案:

答案 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)]