論理インデックス参照
CoddyのRジャーニー「基礎」セクションの一部 — レッスン 68/78。
正確な位置を指定する代わりに、論理ベクトルを使用して要素を選択できます。論理インデックス参照(logical indexing)と呼ばれるこの手法を使用すると、位置ではなく条件に基づいてベクトルをフィルタリングできます。
ベクトルに比較を適用すると、Rは同じ長さの論理ベクトルを返します:
numbers <- c(10, 20, 30, 40, 50)
print(numbers > 25)出力:
[1] FALSE FALSE TRUE TRUE TRUEこの論理ベクトルを角括弧の中で直接使用して、一致する要素を抽出できます。
numbers <- c(10, 20, 30, 40, 50)
print(numbers[numbers > 25])出力:
[1] 30 40 50Rは、論理ベクトルがTRUEである要素のみを保持します。このアプローチは、データをフィルタリングするためにループを記述するよりもはるかに簡潔です。論理演算子を使用して条件を組み合わせることができます:
numbers <- c(10, 20, 30, 40, 50)
print(numbers[numbers >= 20 & numbers <= 40])出力:
[1] 20 30 40論理インデックス参照は、データ操作におけるRの最も強力な機能の一つであり、シンプルで読みやすい式を使ってデータセットをフィルタリングすることを可能にします。
チャレンジ
簡単2行の入力を受け取ります:
- カンマ区切りの数値リスト (例:
15,42,8,67,23,91,34,12,56) - 範囲を表すカンマ区切りの2つの閾値 (例:
20,60)
論理インデックスを使用して、以下の操作を行ってください:
- カンマ区切りの数値から数値ベクトルを作成します。
- 最初の閾値(下限)よりも小さいすべての要素を抽出して出力します。
- 2番目の閾値(上限)よりも大きいすべての要素を抽出して出力します。
- 範囲内(最初の閾値以上、かつ2番目の閾値以下)にあるすべての要素を抽出して出力します。
例えば、入力が以下の場合:
5,25,10,45,60,15,80,35,50
20,50出力は以下のようになります:
[1] 5 10 15
[1] 60 80
[1] 25 45 35 50解説:
- 20未満の要素:5, 10, 15
- 50より大きい要素:60, 80
- 20から50の間(両端を含む)の要素:25, 45, 35, 50
範囲フィルターの条件を組み合わせるには、& 演算子を使用してください。
チートシート
論理インデックスを使用すると、位置ではなく条件に基づいてベクトルをフィルタリングできます。ベクトルに比較を適用すると、Rは論理ベクトルを返します。
numbers <- c(10, 20, 30, 40, 50)
print(numbers > 25)
# 出力: [1] FALSE FALSE TRUE TRUE TRUE角括弧内の論理ベクトルを使用して、一致する要素を抽出します。
numbers <- c(10, 20, 30, 40, 50)
print(numbers[numbers > 25])
# 出力: [1] 30 40 50& (AND) などの論理演算子を使用して条件を組み合わせます。
numbers <- c(10, 20, 30, 40, 50)
print(numbers[numbers >= 20 & numbers <= 40])
# 出力: [1] 20 30 40自分で試してみよう
# 入力を読み込む
con <- file("stdin", "r")
numbers_input <- suppressWarnings(readLines(con, n = 1))
thresholds_input <- suppressWarnings(readLines(con, n = 1))
close(con)
# カンマ区切りの数値を数値ベクトルにパースする
numbers <- as.numeric(unlist(strsplit(numbers_input, ",")))
# しきい値をパースする
thresholds <- as.numeric(unlist(strsplit(thresholds_input, ",")))
lower_bound <- thresholds[1]
upper_bound <- thresholds[2]
# TODO: 以下にコードを記述してください
# 1. 論理インデックスを使用して lower_bound 未満の要素を抽出し、表示する
# 2. 論理インデックスを使用して upper_bound より大きい要素を抽出し、表示する
# 3. & 演算子を用いた論理インデックスを使用して、範囲内(境界値を含む)の要素を抽出し、表示するこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。