Векторизованная логика. Часть 2
Часть раздела Основы путешествия по R на Coddy — урок 21 из 78.
Так же, как у AND и OR есть векторизованные версии, оператор NOT также работает поэлементно с векторами. Когда вы применяете ! к вектору логических значений, он инвертирует каждый элемент в отдельности.
passed <- c(TRUE, FALSE, TRUE, FALSE)
!passed # FALSE TRUE FALSE TRUEКаждое TRUE становится FALSE, а каждое FALSE становится TRUE. Это особенно полезно, когда вы хотите найти элементы, которые не соответствуют определенному условию:
temperatures <- c(18, 25, 30, 15, 22)
# Найти температуры, которые НЕ выше 20
!(temperatures > 20) # TRUE FALSE FALSE TRUE FALSEВы можете комбинировать векторизованное NOT с & и | для создания сложных фильтров:
ages <- c(16, 25, 18, 30, 14)
has_permission <- c(TRUE, TRUE, FALSE, TRUE, TRUE)
# Может участвовать, если: возраст >= 18 ИЛИ (младше 18 И есть разрешение)
can_participate <- ages >= 18 | (ages < 18 & has_permission)
# TRUE TRUE FALSE TRUE TRUEПомните: используйте одиночные &, | и ! при работе с векторами, и двойные &&, || при сравнении одиночных значений.
Задание
ЛегкоИспользуйте векторизованный оператор НЕ (!) вместе с & и | для создания сложных поэлементных логических условий.
Вам предоставлены следующие векторы:
scores <- c(45, 72, 88, 55, 91, 38, 67)
attended <- c(TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE)
submitted_homework <- c(TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE)Используйте векторизованные логические операторы, включая оператор НЕ, для создания следующих логических векторов:
- Создайте вектор с именем
failed, который хранитTRUEдля каждого результата (score), который НЕ больше или равен 60 - Создайте вектор с именем
absent, который хранит значение, противоположноеattended(инвертируйте каждое значение) - Создайте вектор с именем
at_risk, который хранитTRUEдля каждого студента, который НЕ присутствовал (attend) ИЛИ НЕ сдал домашнюю работу (submit homework) - Создайте вектор с именем
passing_but_absent, который хранитTRUEдля каждого студента, чей результат (score) больше или равен 60 И который НЕ присутствовал - Создайте вектор с именем
needs_support, который хранитTRUEдля каждого студента, у которого: (результат меньше 50) ИЛИ (он НЕ присутствовал И НЕ сдал домашнюю работу)
Используйте функцию print() для отображения failed, absent, at_risk, passing_but_absent и needs_support именно в таком порядке.
Шпаргалка
Оператор НЕ (!) работает поэлементно с векторами, инвертируя каждое логическое значение в отдельности:
passed <- c(TRUE, FALSE, TRUE, FALSE)
!passed # FALSE TRUE FALSE TRUEИспользуйте !, чтобы найти элементы, которые не соответствуют условию:
temperatures <- c(18, 25, 30, 15, 22)
!(temperatures > 20) # TRUE FALSE FALSE TRUE FALSEКомбинируйте векторизованный оператор НЕ с & и | для создания сложных фильтров:
ages <- c(16, 25, 18, 30, 14)
has_permission <- c(TRUE, TRUE, FALSE, TRUE, TRUE)
# Можно участвовать, если: age >= 18 ИЛИ (младше 18 И есть разрешение)
can_participate <- ages >= 18 | (ages < 18 & has_permission)
# TRUE TRUE FALSE TRUE TRUEПомните: используйте одиночные &, | и ! для векторов; используйте двойные &&, || для одиночных значений.
Попробуйте сами
# Данные векторы
scores <- c(45, 72, 88, 55, 91, 38, 67)
attended <- c(TRUE, TRUE, FALSE, TRUE, TRUE, FALSE, TRUE)
submitted_homework <- c(TRUE, FALSE, TRUE, TRUE, TRUE, FALSE, FALSE)
# TODO: Напишите ваш код ниже
# 1. Создайте 'failed' - TRUE для баллов НЕ >= 60
# 2. Создайте 'absent' - противоположность attended
# 3. Создайте 'at_risk' - НЕ attended ИЛИ НЕ submitted homework
# 4. Создайте 'passing_but_absent' - score >= 60 И НЕ attended
# 5. Создайте 'needs_support' - (score < 50) ИЛИ (НЕ attended И НЕ submitted homework)
# Выведите результаты
print(failed)
print(absent)
print(at_risk)
print(passing_but_absent)
print(needs_support)В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Основы
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)Функции для работы со строками