Menu
Coddy logo textTech

Логическая индексация

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

Вместо указания точных позиций вы можете использовать логический вектор для выбора элементов. Этот метод, называемый логической индексацией, позволяет фильтровать вектор на основе условий, а не позиций.

Когда вы применяете сравнение к вектору, 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

Задание

Легко

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

  1. Список чисел, разделенных запятыми (например, 15,42,8,67,23,91,34,12,56)
  2. Два пороговых значения, разделенных запятой, представляющих диапазон (например, 20,60)

Используя логическую индексацию:

  1. Создайте числовой вектор из чисел, разделенных запятыми
  2. Извлеките и выведите все элементы, которые меньше первого порога (нижней границы)
  3. Извлеките и выведите все элементы, которые больше второго порога (верхней границы)
  4. Извлеките и выведите все элементы, которые находятся в диапазоне (больше или равны первому порогу И меньше или равны второму порогу)

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

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

Комбинируйте условия с помощью логических операторов, таких как & (И):

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Проверьте себя

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

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