0Pricing
R Academy · レッスン

行列のインデックス指定と部分抽出

[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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. matrix()による行列の作成
  2. 行列のインデックス指定と部分抽出
  3. 行列の算術演算と操作
  4. 行列の転置と形状変更
← R Academyに戻る