Создание сгруппированных категорий с помощью str_detect и dplyr - PullRequest
1 голос
/ 26 июня 2019

Вопрос

Я смотрю на создание пользовательских групп для категории (Type). Я могу это сделать используя str_detect и mutate из dplyr. Однако есть ли более простой способ сделать группировку? Выражение ifelse в mutate кажется неуклюжим и требует большого набора текста.

Спасибо!

Воспроизводимый пример

data <- data.frame('Type' = c("Organ Failure", "Drowning", "Coronary Disease", "Accident"), "No" = c(3, 1, 2, 4))

              Type No
1    Organ Failure  3
2         Drowning  1
3 Coronary Disease  2
4         Accident  4

Ожидаемый результат

              Type No  Grouped Type
1    Organ Failure  3 Health Issues
2         Drowning  1      Accident
3 Coronary Disease  2 Health Issues
4         Accident  4      Accident

Код, используемый для получения указанного результата

data %>% mutate('Grouped Type' = ifelse(str_detect(data$Type, 'Organ|Coronary'), "Health Issues", 
                                        ifelse(str_detect(data$Type, 'Drown|Accident'), "Accident", 0))) 

Ответы [ 2 ]

1 голос
/ 26 июня 2019

Мы можем использовать fuzzyjoin, чтобы сделать это вместо нескольких ifelse. Создайте набор данных ключ / значение, а затем соединитесь с regex_left_join

library(fuzzyjoin)
keydat <- data.frame(Type = c("Organ", "Coronary", "Drown", "Accident"), 
      Grouped_Type = c("Health Issues", "Health Issues", "Accident", "Accident"))
regex_left_join(data, keydat) %>% 
        select(Type = Type.x, No, Grouped_Type)
#            Type No  Grouped_Type
#1    Organ Failure  3 Health Issues
#2         Drowning  1      Accident
#3 Coronary Disease  2 Health Issues
#4         Accident  4      Accident
1 голос
/ 26 июня 2019

Не уверен, что это меньше, но вы можете попробовать case_when, который, на мой взгляд, более понятен и понятен.

library(tidyverse)
data %>%
   mutate(`Grouped Type` = case_when(
           str_detect(Type, 'Organ|Coronary') ~ "Health Issues",
           str_detect(Type, 'Drown|Accident') ~ "Accident", 
           TRUE ~ NA_character_))

#              Type No  Grouped Type
#1    Organ Failure  3 Health Issues
#2         Drowning  1      Accident
#3 Coronary Disease  2 Health Issues
#4         Accident  4      Accident

Также нет необходимости использовать $ внутри mutate.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...