Индексация: выбираем элементы

Учимся доставать из вектора нужные элементы — по номеру, диапазону и по условию.

Индексация — выбор части вектора по позиции или условию с помощью квадратных скобок [ ].

Хранить данные мало — нужно уметь выбирать из них фрагменты: первый элемент, диапазон, всё кроме одного или только те, что удовлетворяют условию. В R за это отвечают квадратные скобки. Индексация — это не мелкий технический приём, а основной способ «разговаривать» с данными: отобрать клиентов старше 30, взять продажи за последний квартал, исключить бракованные измерения. Особенно мощна логическая индексация — на ней, по сути, держится вся фильтрация, к которой мы вернёмся в разделе про dplyr. Освоив скобки, вы поймёте, как работают и более высокоуровневые инструменты.

По позиции и диапазону

Важно: в R нумерация начинается с единицы, а не с нуля.

x <- c(10, 20, 30, 40, 50)
x[1]
x[2:4]
x[c(1, 5)]

Вывод:

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

x[1] — первый элемент. x[2:4] — со второго по четвёртый. x[c(1, 5)] — конкретные позиции, перечисленные вектором.

Отрицательные индексы

Знак минуса означает «всё, кроме». Это удобно, чтобы выбросить ненужные элементы:

x <- c(10, 20, 30, 40, 50)
x[-1]
x[-c(1, 2)]

Вывод:

[1] 20 30 40 50
[1] 30 40 50

Логическая индексация — самое важное

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

x <- c(10, 20, 30, 40, 50)
x[x > 25]

Вывод:

[1] 30 40 50

Сначала x > 25 даёт вектор FALSE FALSE TRUE TRUE TRUE, затем скобки оставляют только элементы напротив TRUE. Это и есть фильтрация данных в чистом виде.

Как работает под капотом

Когда вы пишете x[idx], R смотрит на тип idx. Если это числа — берёт элементы на этих позициях. Если логический вектор — оставляет позиции с TRUE (поэтому его длина должна совпадать с x, иначе сработает recycling). Если отрицательные числа — исключает их. Смешивать положительные и отрицательные индексы нельзя — будет ошибка.

Частые ошибки

  • Считать с нуля. В R x[0] не первый элемент, а пустой результат. Первый — это x[1].
  • Логический вектор не той длины. Если условие короче x, оно «переработается» и отберёт не то.
  • Смешивать плюс и минус в индексе. x[c(1, -2)] вызовет ошибку.

Итог

  • Индексация — квадратные скобки [ ], нумерация с 1.
  • Можно брать по позиции, диапазону, вектору позиций.
  • Минус исключает элементы.
  • Логический вектор в скобках фильтрует по условию.
Проверьте себя
1. С какого числа начинается нумерация элементов вектора в R?
AС 0
BС 1
CС -1
DЗависит от вектора
2. Что вернёт x[-1] для вектора x <- c(10, 20, 30)?
A[1] 10
B[1] 30
C[1] 20 30
DОшибку
3. Как из вектора x выбрать элементы больше 25?
Ax(>25)
Bx[x > 25]
Cfilter(x, 25)
Dx{25}