0Pricing
R Academy · 课时

矩阵索引与子集

使用 [row, col] 表示法访问行、列和元素

矩阵索引与子集 是 CoddyKit 上的免费 R Academy 课时。 这是第 2 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 R Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 R Academy 课程共包含 4 节课。

矩阵索引基础

要访问矩阵中的元素,请使用 m[row, col] 表示法。在 R 中,行索引和列索引从 1 开始。逗号是必需的——省略逗号会将矩阵视为一个扁平向量。

m <- matrix(1:12, nrow = 3, ncol = 4)
cat('Full matrix:
')
print(m)

# Element at row 2, column 3
cat('m[2, 3] =', m[2, 3], '
')

# Element at row 1, column 4
cat('m[1, 4] =', m[1, 4], '
')

提取完整的行

将列索引留空即可提取整行。结果是一个 vector(矩阵维度会被删除)。逗号仍然必须保留。

scores <- matrix(c(88,92,75,81, 79,85,90,73, 95,78,82,88),
                 nrow = 3, byrow = TRUE)
rownames(scores) <- c('Alice', 'Bob', 'Carol')
colnames(scores) <- c('Math', 'Sci', 'Eng', 'Hist')
print(scores)

# Extract Alice's row
alice_scores <- scores[1, ]
cat('Alice:', alice_scores, '
')
cat('Alice mean:', mean(alice_scores), '
')

提取完整的列

将行索引留空即可提取整列。与提取行一样,结果是一个向量。分隔行和列位置的逗号仍然必须保留。

scores <- matrix(c(88,92,75,81, 79,85,90,73, 95,78,82,88),
                 nrow = 3, byrow = TRUE)
rownames(scores) <- c('Alice', 'Bob', 'Carol')
colnames(scores) <- c('Math', 'Sci', 'Eng', 'Hist')

# Extract the Math column
math_scores <- scores[, 1]
cat('Math scores:', math_scores, '
')
cat('Math mean:  ', mean(math_scores), '
')
cat('Math max:   ', max(math_scores), '
')

提取多行和多列

使用索引向量可以一次提取多行或多列。结果是一个子矩阵(仍然是矩阵,而不是向量),会保留二维结构。

m <- matrix(1:16, nrow = 4, ncol = 4)
cat('Original 4x4:
')
print(m)

# Extract rows 1,3 and columns 2,4
sub_m <- m[c(1, 3), c(2, 4)]
cat('Submatrix rows 1,3 cols 2,4:
')
print(sub_m)
cat('Class:', class(sub_m), '
')

按行名或列名访问

如果矩阵具有行名和列名,您可以按名称而不是位置进行索引。这样可读性更好,并且在行或列重新排序后仍然更加稳健。

scores <- matrix(c(88,92,75,81, 79,85,90,73, 95,78,82,88),
                 nrow = 3, byrow = TRUE,
                 dimnames = list(
                   c('Alice', 'Bob', 'Carol'),
                   c('Math', 'Sci', 'Eng', 'Hist')
                 ))

# Access by name
cat('Bob Science:', scores['Bob', 'Sci'], '
')
cat('Carol row:
')
print(scores['Carol', ])
cat('English column:
')
print(scores[, 'Eng'])

对矩阵进行逻辑索引

您可以使用逻辑向量(或逻辑矩阵)来选择元素。当逻辑向量用于某一维时,它会选择值为 TRUE 的行或列。

scores <- matrix(c(88,92,75,81, 79,85,90,73, 95,78,82,88),
                 nrow = 3, byrow = TRUE)
rownames(scores) <- c('Alice', 'Bob', 'Carol')

# Select students with mean score >= 85
row_means <- rowMeans(scores)
high_achievers <- scores[row_means >= 85, ]
cat('High achievers (mean >= 85):
')
print(high_achievers)

负索引——排除行或列

在索引前加上 -,即可排除该行或列。这是一种简洁的方式,可以删除指定的行或列,而不必列出所有想要保留的其他行或列。

m <- matrix(1:12, nrow = 3, ncol = 4, byrow = TRUE)
cat('Original:
')
print(m)

# Drop row 2
cat('Without row 2:
')
print(m[-2, ])

# Drop columns 1 and 3
cat('Without cols 1 and 3:
')
print(m[, c(-1, -3)])

使用 drop = FALSE 保留单个元素

默认情况下,提取单行或单列时会删除维度(返回一个向量)。使用 drop = FALSE 可将结果保留为矩阵(保留行列结构)。

m <- matrix(1:9, nrow = 3, ncol = 3)

# Default: drops to vector
row1_vector <- m[1, ]
cat('m[1,] class:', class(row1_vector), '
')  # numeric (vector)

# drop = FALSE: keeps as 1-row matrix
row1_matrix <- m[1, , drop = FALSE]
cat('m[1,,drop=FALSE] class:', class(row1_matrix), '
')
cat('Dimensions:', dim(row1_matrix), '
')

按索引替换值

您可以将索引与赋值结合起来,修改特定元素。这适用于单个元素、整行、整列或子矩阵。

m <- matrix(0, nrow = 4, ncol = 4)
cat('Zero matrix:
')
print(m)

# Set diagonal to 5
for (i in 1:4) m[i, i] <- 5
cat('After setting diagonal:
')
print(m)

# Replace entire row 2
m[2, ] <- c(1, 2, 3, 4)
cat('After replacing row 2:
')
print(m)

线性(扁平)索引

矩阵在内部以扁平向量的形式存储(按列存储)。您可以按照这种扁平顺序,使用单个整数索引访问元素。这在批量操作中有时很有用。

m <- matrix(c(10,20,30,40,50,60), nrow = 2, ncol = 3)
cat('Matrix:
')
print(m)

# Flat indices: column by column
cat('m[1] =', m[1], '(row 1, col 1)
')
cat('m[3] =', m[3], '(row 1, col 2)
')
cat('m[5] =', m[5], '(row 1, col 3)
')

# Replace flat index 4
m[4] <- 99
print(m)

索引总结

R 中矩阵索引的快速参考:

  • m[r, c] — 第 r 行、第 c 列的单个元素
  • m[r, ] — 第 r 行的全部元素
  • m[, c] — 第 c 列的全部元素
  • m[c(r1,r2), c(c1,c2)] — 子矩阵
  • m['name', 'name'] — 按维度名称访问
  • m[-r, ] — 排除第 r 行
  • m[logical_vec, ] — 逻辑行选择
  • m[r, , drop=FALSE] — 保留为矩阵
m <- matrix(c(5,10,15,20,25,30), nrow = 2, ncol = 3)
cat('m[1,2] =', m[1,2], '
')
cat('m[2,]  =', m[2,], '
')
cat('m[,3]  =', m[,3], '
')
cat('m[-1,] :
'); print(m[-1, ])

快速检查

对于一个有 3 行的矩阵 m,m[-2, ] 会返回什么?

回顾:矩阵索引

做得很好!本课的要点如下:

  • m[r, c] 先指定行再指定列——两个位置由逗号分隔
  • 将一侧留空(m[r, ] 或 m[, c])可提取整行或整列
  • 负索引会排除行或列
  • 逻辑向量可以筛选行或列
  • 命名维度支持按名称索引,可提高可读性
  • drop = FALSE 可防止提取单行或单列时丢失维度
# Practical: find best student per subject
scores <- matrix(c(88,92,75,81, 79,85,90,73, 95,78,82,88),
                 nrow = 3, byrow = TRUE)
rownames(scores) <- c('Alice', 'Bob', 'Carol')
colnames(scores) <- c('Math', 'Sci', 'Eng', 'Hist')

for (subj in colnames(scores)) {
  best <- rownames(scores)[which.max(scores[, subj])]
  cat('Best in', subj, ':', best, '
')
}

常见问题解答

「矩阵索引与子集」课时是免费的吗?

是的 — 「矩阵索引与子集」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。

「矩阵索引与子集」这节课中我会学到什么?

使用 [row, col] 表示法访问行、列和元素 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 R Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 2 节课,共 4 节。

「矩阵索引与子集」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 R Academy 课中编写并运行代码吗?

能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 使用 matrix() 创建矩阵
  2. 矩阵索引与子集
  3. 矩阵算术与运算
  4. 矩阵转置与重塑
← 返回 R Academy