矩阵索引符号语法

Matrix indexing notation syntax

让我们创建矩阵 m。

m <- matrix(1:9, 3,3, T); m
     [,1] [,2] [,3]
[1,]    1    2    3
[2,]    4    5    6
[3,]    7    8    9

m[3,1]    # 7
m[3][1]   # 7

为什么第二个索引符号有效?这两种符号之间有区别吗?使用安全吗?

但序列的行为不同:

m[1:2, 1:2]    # works as expected, return matrix
m[1:2][1:2]    # return vector 1 4, why?

A matrix 是具有 dim 属性的 vector。通过执行 m[3],它只 returns 第三个元素。如果我们想使用链式提取,则在 , 之后提取列索引为空白的行(drop = FALSE - 如果我们想避免将矩阵强制转换为向量)和 select第一列的第一个元素

m[3,, drop = FALSE][1]
#[1] 7

在 OP 的第一个选项中,它使用具有 3, 1 的行索引和列索引,其中 selects 元素基于两个索引


在更新的示例中,OP 将行索引指定为前 2 行,将列指定为前 2 列。所以,它 returns 一个省略了第 3 行和第 3 列的矩阵

m[1:2, 1:2]
#     [,1] [,2]
#[1,]    1    2
#[2,]    4    5

但是,在第二种情况下

m[1:2]
#[1] 1 4

提取前两个元素

同样,如果我们这样做

m[1:5]
#[1] 1 4 7 2 5

是按列顺序排列的前五个元素

因此,

m[1:2][1:2]  

returns 只有 1, 4 因为从第一个 Extract 开始,它只提取 1 和 4。然后,第二个 extract 基于该子集,它也有 2 个元素。如果我们增加索引,这些位置将不可用并由 NA

填充
m[1:2][1:4]
#[1]  1  4 NA NA

元素索引作用于vector

c(m)
#[1] 1 4 7 2 5 8 3 6 9

其中前两个元素是 1 和 4