%in% 演算子
CoddyのRジャーニー「基礎」セクションの一部 — レッスン 70/78。
ベクトル内に値が存在するかどうかを確認する必要がある場合があります。%in% 演算子は、要素が含まれているかどうかをテストするための簡潔な方法を提供し、一致する各要素に対して TRUE を、そうでない場合は FALSE を返します。
基本的な構文は、左側の値が右側のベクトル内に存在するかどうかを確認します:
fruits <- c("apple", "banana", "cherry")
print("banana" %in% fruits)出力:
[1] TRUE複数の値を一度にチェックすることもできます。この演算子は、テストされる各値に対して1つの結果を持つ論理ベクトルを返します。
fruits <- c("apple", "banana", "cherry")
check <- c("banana", "grape", "apple")
print(check %in% fruits)出力:
[1] TRUE FALSE TRUEこれにより、%in% はフィルタリングに最適になります。論理インデックス作成と組み合わせることで、特定のセットに属する要素を抽出できます:
numbers <- c(1, 5, 3, 8, 2, 9)
allowed <- c(1, 2, 3)
print(numbers[numbers %in% allowed])出力:
[1] 1 3 2%in% 演算子は、ユーザー入力の検証や、あらかじめ定義された許容値のリストに基づいてデータをフィルタリングする場合に特に便利です。
チャレンジ
簡単3行の入力が与えられます:
- 在庫にあるアイテムのカンマ区切りリスト(例:
apple,banana,milk,bread,eggs,cheese) - ショッピングリストにあるアイテムのカンマ区切りリスト(例:
milk,butter,eggs,juice) - セール対象のアイテムのカンマ区切りリスト(例:
bread,juice,yogurt)
%in% 演算子を使用して、以下の処理を行ってください:
- 各カンマ区切りの入力から文字ベクトルを作成します
- ショッピングリストのアイテムのうち、すでに在庫にあるものを確認し、その論理ベクトルの結果を表示します
- 在庫にないショッピングリストのアイテム(購入が必要なアイテム)をフィルタリングして表示します
- 購入が必要なアイテムのうち、セール対象でもあるものをフィルタリングして表示します
例えば、入力が以下の場合:
apple,banana,milk,bread,eggs
milk,butter,eggs,juice,apple
bread,juice,yogurt,butter出力は以下のようになります:
[1] TRUE FALSE TRUE FALSE TRUE
[1] "butter" "juice"
[1] "butter" "juice"解説:
- 在庫と照合したショッピングリスト:milk (TRUE), butter (FALSE), eggs (TRUE), juice (FALSE), apple (TRUE)
- 在庫にないアイテム(購入が必要):butter, juice
- セール中の購入アイテム:butter と juice は両方ともセールリストに含まれています
ベクトルに含まれていないアイテムを見つけるには、%in% と一緒に ! 演算子を使用してください。
チートシート
%in% 演算子は、値がベクトル内に存在するかどうかを確認し、TRUE または FALSE を返します:
fruits <- c("apple", "banana", "cherry")
print("banana" %in% fruits)出力:
[1] TRUE複数の値を一度にチェックして、論理ベクトルを取得します:
fruits <- c("apple", "banana", "cherry")
check <- c("banana", "grape", "apple")
print(check %in% fruits)出力:
[1] TRUE FALSE TRUE論理インデックス作成で %in% を使用して、要素をフィルタリングします:
numbers <- c(1, 5, 3, 8, 2, 9)
allowed <- c(1, 2, 3)
print(numbers[numbers %in% allowed])出力:
[1] 1 3 2! を %in% と組み合わせて使用し、ベクトルに含まれていない項目を見つけます:
items <- c("milk", "butter", "eggs")
inventory <- c("milk", "eggs")
print(items[!items %in% inventory])出力:
[1] "butter"自分で試してみよう
# 入力を読み込む
con <- file("stdin", "r")
inventory_input <- suppressWarnings(readLines(con, n = 1))
shopping_list_input <- suppressWarnings(readLines(con, n = 1))
sale_items_input <- suppressWarnings(readLines(con, n = 1))
close(con)
# TODO: 以下にコードを記述してください
# 1. strsplit() を使用して、カンマ区切りの各入力から文字ベクトルを作成します
# 2. ショッピングリストの項目のうち、すでに在庫(inventory)にあるものを確認します (%in% を使用)
# 3. 在庫にないショッピングリストの項目を抽出します (%in% と ! を使用)
# 4. 購入が必要な項目のうち、セール対象でもある項目を抽出しますこのレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。