和处理向量一样,我们不仅需要创建矩阵,也需要从中抽取数据,这称为构建矩阵子

集(matrix subsetting)。

矩阵是用两个维度表示和访问的向量,可以用一个二维存取器(accessor)[ , ]来访

问,这类似于构建向量子集时用的一维存取器[ ]。

我们可以为每个维度提供一个向量来确定一个矩阵的子集。方括号中的第 1 个参数是

行选择器(row selector),第 2 个是列选择器(column selector)。与构建向量子集一样,可

以在两个维度中使用数值向量、逻辑向量和字符向量。

以下代码展示了构建矩阵子集的多种方式:

m1

## c1 c2 c3

## r1 1 4 7

## r2 2 5 8

## r3 3 6 9

提取位于第 1 行第 2 列的单个元素:

m1[1, 2]

## [1] 4

也可以通过设定位置范围来构建子集:

m1[1:2, 2:3]

## c2 c3

## r1 4 7

## r2 5 8

若一个维度的参数空缺,则该维度的所有值都会被选出来:

m1[1,]

## c1 c2 c3

## 1 4 7

m1[,2]

## r1 r2 r3

## 4 5 6

m1[1:2,]

## c1 c2 c3

## r1 1 4 7

## r2 2 5 8

m1[, 2:3]

## c2 c3

## r1 4 7

## r2 5 8

## r3 6 9

负数表示在构建矩阵子集时可排除该位置,这和向量中的用法完全一致:

m1[-1,]

## c1 c2 c3

## r2 2 5 8

## r3 3 6 9

m1[,-2]

## c1 c3

## r1 1 7

## r2 2 8

## r3 3 9

注意到矩阵有行名和列名,我们可以使用字符向量来构建子集:

2.2 矩阵 33

m1[c("r1", "r3"), c("c1", "c3")]

## c1 c3

## r1 1 7

## r3 3 9

需要注意的是,矩阵是一个用两个维度表示和访问的向量,但它本质上仍然是一个向

量。因此,向量的一维存取器也可以用来构建矩阵子集:

m1[1]

## [1] 1

m1[9]

## [1] 9

m1[3:7]

## [1] 3 4 5 6 7

因为一个向量只能包含相同类型的元素,矩阵也是如此。所以它们的操作方式非常相

似。如果输入一个不等式,它会返回另一个大小相同的逻辑矩阵。

m1 > 3

## c1 c2 c3

## r1 FALSE TRUE TRUE

## r2 FALSE TRUE TRUE

## r3 FALSE TRUE TRUE

我们可以使用一个大小相同的逻辑矩阵来构建子集,就好像它是一个向量一样:

m1[m1 > 3]

## [1] 4 5 6 7 8 9