行列のインデックス指定と部分抽出
[row, col]記法を使って行、列、要素にアクセスします。
「行列のインデックス指定と部分抽出」はCoddyKit上の無料R Academyレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはR Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 R Academyコースには全4レッスンが含まれています。
行列のインデックスの基本
行列の要素にアクセスするには、m[row, col]という記法を使います。Rでは、行と列のインデックスは1から始まります。カンマは必須です。カンマを省略すると、行列が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], '
')行全体の取り出し
列のインデックスを空欄にすると、行全体を取り出せます。結果はベクトルになります(行列の次元は削除されます)。カンマは必ず残してください。
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), '
')複数の行と列のサブセット化
インデックスのベクトルを使うと、複数の行または列を一度に取り出せます。結果は部分行列になります(ベクトルではなく、行列のままです)。2次元の構造も維持されます。
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'])行列の論理インデックス
論理ベクトル(または論理行列)を使って要素を選択できます。1つの次元に論理ベクトルを使うと、値が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による単一要素の取り出し
デフォルトでは、1つの行または列を取り出すと次元が削除され、ベクトルが返されます。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)線形(フラット)インデックス
行列は内部的には1次元のベクトルとして格納されます(列ごとの順序です)。このフラットな順序で、単一の整数インデックスを使って要素にアクセスできます。一括処理で役立つ場合があります。
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]は行、列の順に指定します。2つの位置はカンマで区切ります- 片側を空欄(
m[r, ]またはm[, c])にすると、行全体または列全体を取り出せます - 負のインデックスは行または列を除外します
- 論理ベクトルで行または列をフィルタリングできます
- 名前付きの次元を使うと、読みやすい名前でインデックスを指定できます
drop = FALSEを使うと、1つの行または列を取り出す際に次元が失われるのを防げます
# 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, '
')
}よくある質問
「行列のインデックス指定と部分抽出」レッスンは無料ですか?
はい。「行列のインデックス指定と部分抽出」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、R Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 R Academyコースには全4レッスンが含まれています。
「行列のインデックス指定と部分抽出」で何を学びますか?
[row, col]記法を使って行、列、要素にアクセスします。 ブラウザで直接実行するハンズオンコードでR Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
R Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのR Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「行列のインデックス指定と部分抽出」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このR Academyレッスンでコードを書いて実行できますか?
はい。すべてのR Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- matrix()による行列の作成
- 行列のインデックス指定と部分抽出
- 行列の算術演算と操作
- 行列の転置と形状変更