ベクトルのスライシングとインデックス参照
CoddyのRジャーニー「基礎」セクションの一部 — レッスン 67/78。
単一の要素にアクセスする方法と、ベクターを反復処理する方法を学びました。次に、スライシングを使用して一度に複数の要素を抽出する方法を探索しましょう。この手法を使用すると、単一の操作でベクターのサブセットを取得できます。
複数の要素を抽出するには、角括弧の中にインデックスのベクトルを渡します:
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
自分で試してみよう
# 入力を読み込む
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 までの要素を除外してベクトルを表示する(範囲指定による負のインデックス指定)このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。