Индексация: выбираем элементы
Учимся доставать из вектора нужные элементы — по номеру, диапазону и по условию.
Индексация — выбор части вектора по позиции или условию с помощью квадратных скобок
[ ].
Хранить данные мало — нужно уметь выбирать из них фрагменты: первый элемент, диапазон, всё кроме одного или только те, что удовлетворяют условию. В 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. - Можно брать по позиции, диапазону, вектору позиций.
- Минус исключает элементы.
- Логический вектор в скобках фильтрует по условию.