Изменения в tidyselect 1.2.0
tidyselect — это низкоуровневый пакет, обеспечивающий основу для контекстов выбора в функциях tidyverse. Контекст выбора — это аргумент, подобный cols в pivot_longer(), или набор аргументов, как ... в таких функциях как select(). Т.е. даже если напрямую сам tidyselect вы не используете, то косвено вы его используете при манипуляции данных в dplyr и tidyr.
Обновляться до tidyselect 1.2.0 рекомендуется после выпуска dplyr 1.1.0, который планируется на конец октября.
Основные изменения:
1. Использование вектор имён для указания списка столбцов без all_of() и any_of()
О функциях all_of() и any_of() я рассказывал в одном из своих видео уроков, найти его можно по ссылке. Если вкратце то эти функции позволяют вам использовать вектор имён для выбора столбцов, например внутри функции dplyr::select():
● all_of() - выбирает столбцы по именам указанным в векторе, и возвращает ошибку, если какой то из указанных столбцов отсутствует в таблице.
● any_of() - выбирает столбцы по именам указанным в векторе, если какой то из указанных столбцов отсутствует в таблице, он просто будет проигнорирован.
В новой версии tidyselect обращение к столбцам из вектора имён возможно только с использованием этих функций. Сделано это с целью устранения несогласованности между обращения к переменным глобального окружения и локальным переменных таблицы.
В приведённом ниже примере мы создаём новую глобальную переменную vars со списком имён нужных нам столбцов. После мы создаём локальную переменную в таблице с таким же именем, которая просто хранит номер строки.
Неоднозначность старого подхода при выборе столбцов из вектора имён была в том, что по коду не очевидно, мы хотим обратиться для выбора столбцов к списку имён из глобальной переменной vars, или получить таблицу с одним столбцом vars.
library(tidyverse)
my_data <- mtcars |> mutate(vars = 1:n())
vars <- c("cyl", "am")
my_data |> select(all_of(vars)) |> glimpse()
Rows: 32
Columns: 2
$ cyl <dbl> 6, 6, 4, 6, 8, 6, 8, 4, 4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 4, 4, 4, 8, 6, 8, 4
$ am <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1
Мы получили таблицу с двумя столбцами, перечисленными в глобальной переменной vars.
my_data |> select(vars) |> glimpse()
Rows: 32
Columns: 1
$ vars <int> 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32
А так, мы получили таблице с одним столбцом vars, таким образом разработчики устранили описанную выше неоднозначность.
2. Использование .data$colname для обращение с локальным переменным таблицы
Местоимение .data — это удобный способ программирования с функциями маскирования данных, такими как mutate() и filter(). Подробнее о нём рассказано в статье "Программирование с dplyr".
Пример использования:
var <- "am"
mtcars |> transmute(am = .data[[var]] * 10) |> glimpse()
mtcars |> mutate(.data$am * 2) |> glimpse()
Начиная с версии tidyselect 1.2.0, в связи с описанными выше рекомендациями по использованию функций all_of() и any_of() использование местоимение .data становится устаревшим, вместо него обращайтесь локальным переменным таблицы через указанные функции, или просто прописав в кавычках название нужного вам столбца:
var <- "am"
mtcars |> select(all_of(var)) |> glimpse()
#> Rows: 32
#> Columns: 1
#> $ am <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,…
mtcars |> select("am") |> glimpse()
#> Rows: 32
#> Columns: 1
#> $ am <dbl> 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1,…
Ссылки:
- Информация заимствована из статьи "tidyselect 1.2.0"
#заметки_по_R