Оператор %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% особенно полезен при проверке пользовательского ввода или фильтрации данных на основе предопределенного списка допустимых значений.
Задание
ЛегкоВы получите три строки входных данных:
- Список товаров в вашем инвентаре через запятую (например,
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. Проверьте, какие товары из списка покупок уже есть в инвентаре (используйте %in%)
# 3. Отфильтруйте товары из списка покупок, которых НЕТ в инвентаре (используйте ! с %in%)
# 4. Отфильтруйте товары, которые нужно купить и которые также участвуют в распродажеВ этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
4Операторы. Часть 2
Логические операторы (AND, OR)Логические операторы. Часть 2 (NOT)Повторение: простая логикаВекторизованная логика. Часть 1Векторизованная логика. Часть 27Калькулятор разделения счета
Приветственное сообщениеПолучение пользовательского ввода13Векторы: продвинутый уровень
Срезы и индексация векторовЛогическая индексацияАрифметика и ресайклинг векторовОператор %in%2Переменные и типы данных
Числовой тип данныхЦелочисленный тип данныхСимвольный тип данныхЛогический тип данныхПроверка типов данныхПравила именованияПропущенные значения: NAИтоги — создание переменных5Принятие решений
Оператор ifКонструкция if - elseПовторение: Простой калькуляторВложенные конструкции if - else8Циклы
Цикл ForЦикл WhileBreakNext (Continue)Повторение: ФакториалГенерация последовательностей (seq, :)Вложенные циклыПовторение: Динамический ввод3Операторы. Часть 1
Арифметические операторыЦелочисленное деление и остаток от деленияОператоры присваиванияПовторение: простая математикаОператоры сравнения6Основы ввода-вывода
Вывод через printКоманда cat для выводаВывод с переменнымиЧтение ввода через readline()Основы преобразования типовПовторение — Калькулятор возрастаПовторение — Истина или ложь9Функции
Объявление функцииАргументы функцииВозвращаемые значенияПовторение — функция SigmaПовторение — функция валидацииЗначения параметров по умолчанию12Итерация по последовательностям
Итерация по элементам вектораИспользование seq_along()Итерация по символам (strsplit)Функции для работы со строками