Обновление функций case_when() и if_else() в dplyr development version
Для тех кто впервые слышит о функции case_when() по этой ссылке можно познакомится с ней по ближе.
Тем кто с case_when() знаком, расскажу о том, что в ней изменилось:
● Ранее для обозначения условия по умолчанию, которое будет выполнено только в том случае, когда ни одно из всех выше указанных не выполнились, использовали конструкцию TRUE ~ default_value, что снижало читабельность кода, теперь для этого добавлен отдельный аргумент .default.
● Функции case_when() и if_else() были переписаны на базе пакета vctrs. Например, теперь нет необходимости использовать типизированные варианты NA_character, NA_complex, можно использовать просто обощённый вариант - NA.
● case_when() теперь поддерживает большее количество типов значений. Например, вы можете использовать tibble для одновременного создания нескольких столбцов.
Примеры того, как изменился синтаксис:
# тестовые данные
x <- c(1, 3, 0, 5, 0 ,7)
# старый вариант
dplyr::case_when(
x == 0 ~ NA_character,
x <= 2 ~ "low",
x <= 4 ~ "medium",
TRUE ~ "high"
)
# новый вариант
dplyr::case_when(
x == 0 ~ NA,
x <= 2 ~ "low",
x <= 4 ~ "medium",
.default = "high"
)
А приведённый ниже пример вообще в старом варианте реализовать не получилось бы:
library(dplyr)
df <- tibble(x = c(1, 3, 0, 5, 0 ,7))
df %>% mutate(
case_when(
x == 0 ~ NA,
x <= 2 ~ tibble(type = 'low', id = 1),
x <= 4 ~ tibble(type = 'medium', id = 2),
.default = tibble(type = 'high', id = 3)
)
)
Результат:
# A tibble: 6 × 3
x type id
<dbl> <chr> <dbl>
1 1 low 1
2 3 medium 2
3 0 NA NA
4 5 high 3
5 0 NA NA
6 7 high 3
Ссылки:
- узнал об этом из твита Девиса Вогана
#заметки_по_R