Обложка канала

R4marketing | канал Алексея Селезнёва | Язык R

Автор канала Алексей Селезнёв, руководитель отдела аналитики в Netpeak, автор R пакетов: ryandexdirect, rfacebookstat и др. В канале публикуются статьи, доклады, новости, заметки по языку R.

R4marketing | канал Алексея Селезнёва | Язык R

4 года назад
Открыть в
​​Обновление функций 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