ベクトルのスライシングとインデックス参照
CoddyのRジャーニー「基礎」セクションの一部 — レッスン 67/78。
単一の要素にアクセスする方法と、ベクターを反復処理する方法を学びました。次に、スライシングを使用して複数の要素を一度に抽出する方法を見ていきましょう。この手法を使用すると、1回の操作でベクターのサブセットを取得できます。
複数の要素を抽出するには、角括弧の中にインデックスのベクトルを渡します:
numbers <- c(10, 20, 30, 40, 50)
print(numbers[c(1, 3, 5)])出力:
[1] 10 30 50また、コロン演算子を使用して、連続する要素の範囲を選択することもできます。
numbers <- c(10, 20, 30, 40, 50)
print(numbers[2:4])出力:
[1] 20 30 40Rにおいて、負のインデックスは強力です。それらは要素を選択するのではなく、除外します:
numbers <- c(10, 20, 30, 40, 50)
print(numbers[-2])出力:
[1] 10 30 40 50負のインデックスのベクトルを渡すことで、複数の要素を除外できます。
numbers <- c(10, 20, 30, 40, 50)
print(numbers[-c(1, 5)])出力:
[1] 20 30 40注意:同じ選択内で正のインデックスと負のインデックスを混在させることはできません。numbers[c(1, -2)]のように実行しようとすると、Rはエラーを返します。
チャレンジ
簡単2行の入力を受け取ります:
- カンマ区切りの数値リスト (例:
100,200,300,400,500,600,700) - 除外する範囲を表すカンマ区切りの2つのインデックス (例:
2,5)
以下の操作を実行してください:
- カンマ区切りの数値から数値ベクトルを作成します
- インデックスのベクトルを使用して、1番目、3番目、5番目の位置にある要素を表示します
- コロン演算子を使用して、2番目から4番目の位置にある要素を表示します
- 負のインデックスを使用して、指定された最初のインデックスにある要素を除外したベクトルを表示します
- 範囲を指定した負のインデックスを使用して、最初のインデックスから2番目のインデックスまでの要素を除外したベクトルを表示します
例えば、入力が以下の場合:
10,20,30,40,50,60,70
3,5出力は以下のようになります:
[1] 10 30 50
[1] 20 30 40
[1] 10 20 40 50 60 70
[1] 10 20 60 70解説:
- 1番目、3番目、5番目の位置にある要素は:10, 30, 50
- 2番目から4番目の位置にある要素は:20, 30, 40
- 3番目の位置を除外すると:10, 20, 40, 50, 60, 70
- 3番目から5番目の位置を除外すると:10, 20, 60, 70
チートシート
ベクトルから複数の要素を抽出するには、角括弧の中にインデックスのベクトルを渡します:
numbers <- c(10, 20, 30, 40, 50)
print(numbers[c(1, 3, 5)]) # [1] 10 30 50連続する要素の範囲を選択するには、コロン演算子を使用します:
numbers <- c(10, 20, 30, 40, 50)
print(numbers[2:4]) # [1] 20 30 40負のインデックスは、要素を選択するのではなく除外します:
numbers <- c(10, 20, 30, 40, 50)
print(numbers[-2]) # [1] 10 30 40 50負のインデックスのベクトルを渡すことで、複数の要素を除外します:
numbers <- c(10, 20, 30, 40, 50)
print(numbers[-c(1, 5)]) # [1] 20 30 40重要: 同じ選択内で正のインデックスと負のインデックスを混在させることはできません。
自分で試してみよう
# 入力を読み込む
con <- file("stdin", "r")
numbers_input <- suppressWarnings(readLines(con, n = 1))
indices_input <- suppressWarnings(readLines(con, n = 1))
close(con)
# カンマ区切りの数値を数値ベクトルにパースする
numbers <- as.numeric(strsplit(numbers_input, ",")[[1]])
# 2つのインデックスをパースする
indices <- as.numeric(strsplit(indices_input, ",")[[1]])
idx1 <- indices[1]
idx2 <- indices[2]
# TODO: 以下にコードを記述してください
# 1. インデックスのベクトルを使用して、1番目、3番目、5番目の要素を表示する
# 2. コロン演算子を使用して、2番目から4番目までの要素を表示する
# 3. idx1の位置にある要素を除外してベクトルを表示する(負のインデックス)
# 4. idx1からidx2までの要素を除外してベクトルを表示する(範囲指定の負のインデックス)このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。