R语言数据结构8:子集操作符(subsetting)-矩阵和数组
在 R 语言中,对矩阵和数组进行子集操作时,可以通过以下三种方式实现:
- 使用多个向量:为每个维度提供一个一维索引,并用逗号分隔。例如,
m[1:3, 2:5] 会从矩阵 m 中提取第 1 到第 3 行和第 2 到第 5 列的子集。 - 使用单个向量:将矩阵或数组视为一个向量进行索引。例如,
vals[c(4, 15)] 会从矩阵 vals 中提取第 4 和第 15 个元素。 - 使用矩阵:当高维数据有名称属性时,可以使用字符串类矩阵作为索引。例如,
df[["x", "y"]] 会从数据框 df 中提取名为 “x” 和 “y” 的列。
1.索引类型
数值索引
- 正整数:
mat[c(1,3),c(2,4)]#提取第1、3行,2、4列。 - 负整数:
mat[-1,]#排除第2行
逻辑索引
- 条件筛选:
mat[mat > 5]#提取所有大于5的元素)结果降维为向量)
名称索引
2.维度控制
2.1默认降维规则
- 若子集操作导致某维度长度为 1(如单行或单列),R 会自动将该维度简化为向量。
- 示例:
mat[1, ] 返回向量而非 1×n 矩阵。
2.2禁止降维
添加 drop = FALSE 选项:
mat[1, , drop = FALSE] # 结果保持为矩阵
ara[1, 2, 2, drop = FALSE] # 结果保持为数组
# 创建 4×6 矩阵
Mat <- matrix(1:24, ncol = 6)
Mat
# 提取子集
sub_mat <- Mat[2:3, c(1, 4)] # 第 2-3 行,第 1 和 4 列 → 2×2 矩阵
sub_mat
Mat[Mat[,2] > 5, ] # 筛选第 2 列 >5的行
A matrix: 4 × 6 of type int| 1 | 5 | 9 | 13 | 17 | 21 |
| 2 | 6 | 10 | 14 | 18 | 22 |
| 3 | 7 | 11 | 15 | 19 | 23 |
| 4 | 8 | 12 | 16 | 20 | 24 |
A matrix: 2 × 2 of type int| 2 | 14 |
| 3 | 15 |
A matrix: 3 × 6 of type int| 2 | 6 | 10 | 14 | 18 | 22 |
| 3 | 7 | 11 | 15 | 19 | 23 |
| 4 | 8 | 12 | 16 | 20 | 24 |