矩阵索引与子集
使用 [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 反馈 — 无需本地设置。