Menu
Coddy logo textTech

Оператор %in%

Часть раздела Основы путешествия по R на Coddy — урок 70 из 78.

Иногда вам нужно проверить, существуют ли значения внутри вектора. Оператор %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% особенно полезен при проверке пользовательского ввода или фильтрации данных на основе предопределенного списка допустимых значений.

challenge icon

Задание

Легко

Вы получите три строки входных данных:

  1. Список товаров в вашем инвентаре через запятую (например, apple,banana,milk,bread,eggs,cheese)
  2. Список товаров в вашем списке покупок через запятую (например, milk,butter,eggs,juice)
  3. Список товаров, на которые действует скидка, через запятую (например, bread,juice,yogurt)

Используя оператор %in%:

  1. Создайте символьные векторы из каждой строки входных данных, разделенных запятыми
  2. Проверьте, какие товары из списка покупок уже есть в вашем инвентаре, и выведите результат в виде логического вектора
  3. Отфильтруйте и выведите товары из списка покупок, которых НЕТ в вашем инвентаре (товары, которые нужно купить)
  4. Отфильтруйте и выведите товары, которые вам нужно купить и на которые также действует скидка

Например, если входные данные следующие:

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. Проверьте, какие товары из списка покупок уже есть в инвентаре (используйте %in%)
# 3. Отфильтруйте товары из списка покупок, которых НЕТ в инвентаре (используйте ! с %in%)
# 4. Отфильтруйте товары, которые нужно купить и которые также участвуют в распродаже
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Основы