dplyr: фильтрация и выбор колонок

Знакомимся с dplyr — пакетом, который делает преобразование таблиц простым и читаемым.

dplyr — пакет tidyverse с набором «глаголов»-функций для преобразования таблиц данных.

Базовая индексация df[df$age > 18, ] работает, но громоздка: имя таблицы приходится повторять, скобки и запятые легко перепутать, а сложные цепочки преобразований превращаются в нечитаемую кашу. dplyr предлагает читаемые функции-глаголы: filter отбирает строки, select — колонки, arrange сортирует, mutate добавляет столбцы. Код читается почти как описание действий на русском.

Философия dplyr проста: каждая функция делает одну понятную вещь, а сложные преобразования собираются из этих «кирпичиков». Это резко снижает порог входа — даже не зная R глубоко, по коду filter(people, age > 18) сразу ясно, что происходит. Именно поэтому dplyr стал де-факто стандартом обработки таблиц в R и его учат раньше базовой индексации.

filter — отбор строк

filter оставляет только строки, удовлетворяющие условию:

library(dplyr)
adults <- filter(people, age >= 18)
young_msk <- filter(people, age < 30, city == "Москва")

Несколько условий через запятую означают «И» (все должны выполняться). Для «ИЛИ» используют вертикальную черту |. Сравните с базовым people[people$age >= 18, ] — у filter не нужно повторять имя таблицы.

select — выбор колонок

select оставляет нужные столбцы:

short <- select(people, name, age)
no_city <- select(people, -city)

Колонки перечисляют по именам без кавычек. Минус перед именем означает «убрать эту колонку», оставив остальные.

arrange — сортировка

sorted <- arrange(people, age)
sorted_desc <- arrange(people, desc(age))

По умолчанию сортировка по возрастанию; desc() переворачивает порядок на убывание.

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

Главная магия dplyrнестандартное вычисление (non-standard evaluation). Когда вы пишете filter(people, age >= 18), имя age не существует как переменная в вашем окружении — это колонка таблицы. dplyr «откладывает» вычисление выражения и ищет age внутри переданной таблицы. Поэтому колонки можно указывать без кавычек и без people$. Это делает код коротким, но иногда удивляет: если есть переменная и колонка с одним именем, побеждает колонка.

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

  • Сравнивать через =. В условии нужно ==: filter(df, city == "Москва"). Один знак = вызовет ошибку.
  • Брать имена колонок в кавычки в select. Обычно пишут без кавычек: select(df, name, age).
  • Забыть присвоить результат. Глаголы dplyr не меняют таблицу на месте — они возвращают новую. Результат надо сохранить.

Итог

  • filter — отбор строк по условию (запятая = И, | = ИЛИ).
  • select — выбор/исключение колонок по именам.
  • arrange сортирует, desc() — по убыванию.
  • Колонки указывают без кавычек благодаря нестандартному вычислению.
Проверьте себя
1. Что делает функция filter в dplyr?
AВыбирает колонки
BОтбирает строки по условию
CСортирует таблицу
DДобавляет новый столбец
2. Как в filter задать условие «город равен Москва»?
Acity = "Москва"
Bcity == "Москва"
Ccity -> "Москва"
Dcity is "Москва"
3. Как отсортировать таблицу по age по убыванию?
Aarrange(df, age)
Barrange(df, desc(age))
Csort(df, age)
Darrange(df, -age, TRUE)