Menu
Coddy logo textTech

論理インデックス参照

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 50

Rは、論理ベクトルがTRUEである要素のみを保持します。このアプローチは、データをフィルタリングするためにループを記述するよりもはるかに簡潔です。論理演算子を使用して条件を組み合わせることができます:

numbers <- c(10, 20, 30, 40, 50)
print(numbers[numbers >= 20 & numbers <= 40])

出力:

[1] 20 30 40

論理インデックス参照は、データ操作におけるRの最も強力な機能の一つであり、シンプルで読みやすい式を使ってデータセットをフィルタリングすることを可能にします。

challenge icon

チャレンジ

簡単

2行の入力を受け取ります:

  1. カンマ区切りの数値リスト (例: 15,42,8,67,23,91,34,12,56)
  2. 範囲を表すカンマ区切りの2つの閾値 (例: 20,60)

論理インデックスを使用して、以下の操作を行ってください:

  1. カンマ区切りの数値から数値ベクトルを作成します。
  2. 最初の閾値(下限)よりも小さいすべての要素を抽出して出力します。
  3. 2番目の閾値(上限)よりも大きいすべての要素を抽出して出力します。
  4. 範囲内(最初の閾値以上、かつ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. & 演算子を用いた論理インデックスを使用して、範囲内(境界値を含む)の要素を抽出し、表示する
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

基礎のすべてのレッスン