构建矩阵子集
和处理向量一样,我们不仅需要创建矩阵,也需要从中抽取数据,这称为构建矩阵子
集(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