ベクトルのスライシングとインデックス参照
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 40負のインデックスはRで強力です。要素を選択するのではなく、除外します:
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)
スターターコードはすでに入力を読み込み、数値ベクトルを作成しています。次の順序で、正確に4行を出力してください:
- インデックスのベクトルを使用して、位置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 までの要素を除外したベクトルを出力する(範囲付きの負のインデックス)このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
基礎のすべてのレッスン
自分で練習してみよう: Rオンラインコンパイラ