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()— по убыванию.- Колонки указывают без кавычек благодаря нестандартному вычислению.