Menu
CoddyTech

Срезы и индексация векторов

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

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

Чтобы извлечь несколько элементов, передайте вектор индексов внутри квадратных скобок:

numbers <- c(10, 20, 30, 40, 50)
print(numbers[c(1, 3, 5)])

Вывод:

[1] 10 30 50

Вы также можете использовать оператор двоеточия, чтобы выбрать диапазон последовательных элементов:

numbers <- c(10, 20, 30, 40, 50)
print(numbers[2:4])

Вывод:

[1] 20 30 40

Отрицательные индексы в R — мощный инструмент. Они исключают элементы, а не выбирают их:

numbers <- c(10, 20, 30, 40, 50)
print(numbers[-2])

Вывод:

[1] 10 30 40 50

Вы можете исключить несколько элементов, передав вектор отрицательных индексов:

numbers <- c(10, 20, 30, 40, 50)
print(numbers[-c(1, 5)])

Вывод:

[1] 20 30 40

Помните: нельзя смешивать положительные и отрицательные индексы в одном выборе. R выдаст ошибку, если вы попробуете numbers[c(1, -2)].

challenge icon

Задание

Легко

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

  1. Разделённый запятыми список чисел (например, 100,200,300,400,500,600,700)
  2. Два индекса, разделённых запятой и обозначающих диапазон для исключения (например, 2,5)

Начальный код уже считывает входные данные и создаёт числовой вектор. Выведите ровно четыре строки в следующем порядке:

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

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

10,20,30,40,50,60,70
3,5

Выходные данные должны иметь вид:

[1] 10 30 50
[1] 20 30 40
[1] 10 20 40 50 60 70
[1] 10 20 60 70

Объяснение:

  • Элементы на позициях 1, 3 и 5: 10, 30, 50
  • Элементы с позиции 2 по 4: 20, 30, 40
  • Исключение позиции 3 даёт: 10, 20, 40, 50, 60, 70
  • Исключение позиций с 3 по 5 даёт: 10, 20, 60, 70

Попробуйте сами

# Прочитать ввод
con <- file("stdin", "r")
numbers_input <- suppressWarnings(readLines(con, n = 1))
indices_input <- suppressWarnings(readLines(con, n = 1))
close(con)

# Разобрать числа, разделённые запятыми, в числовой вектор
numbers <- as.numeric(strsplit(numbers_input, ",")[[1]])

# Разобрать два индекса
indices <- as.numeric(strsplit(indices_input, ",")[[1]])
idx1 <- indices[1]
idx2 <- indices[2]

# TODO: Напишите свой код ниже
# 1. Вывести элементы на позициях 1, 3 и 5 с помощью вектора индексов

# 2. Вывести элементы с позиции 2 по позицию 4 с помощью оператора двоеточия

# 3. Вывести вектор с исключённым элементом на idx1 (отрицательная индексация)

# 4. Вывести вектор с исключёнными элементами от idx1 до idx2 (отрицательная индексация с диапазоном)
quiz iconПроверьте себя

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

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

Потренируйтесь самостоятельно: Онлайн-компилятор R