используйте case_when в R, смотря на число в конце имени столбца больше, чем число в конце имени другого столбца - PullRequest
2 голосов
/ 14 июня 2019

Я хочу использовать case_when() в dplyr, чтобы создать новый категориальный столбец, в котором будет указано, каков текущий статус человека на тренировке.

У меня есть тиббл, который выглядит следующим образом:

library(dplyr)
problem <- tibble(name = c("Angela", "Claire", "Justin"),
                  status_1 = c("Registered", "No Action", "Completed"),
                  status_2 = c("Withdrawn", "No Action", "Registered"),
                  status_3 = c("No Action", "Registered", "Withdrawn"))

Если человек когда-либо проходил курс, его статус должен быть завершен (даже если он случайно зарегистрируется в классе позднее, как доказательство Джастина в этом примере).Их статус должен быть зарегистрирован, если они не завершили курс и более поздний статус не отменяет этого, например, «нет действия» или «отозван». Они должны иметь статус «Не принято», если они ничего не сделалиили снят позже, чем они зарегистрировались.

В этом примере окончательный набор данных должен выглядеть следующим образом:

library(dplyr)
solution <- tibble(name = c("Angela", "Claire", "Justin"),
                   status_1 = c("Registered", "No Action", "Completed"),
                   status_2 = c("Withdrawn", "No Action", "Registered"),
                   status_3 = c("No Action", "Registered", "Withdrawn"),
                   current = c("Not Taken", "Registered", "Completed"))

Джастин завершен, потому что он прошел курс в любой момент.Анжела не взята, потому что она отменила свою регистрацию.Клэр зарегистрирована, потому что зарегистрирован ее самый дальний статус.

Это то, что я имею до сих пор.Это правильно классифицирует Джастина и Клэр, но это неправильно классифицирует Анжелу.Я понимаю, почему это неправильно классифицирует ее, но я не знаю, как сделать регистрацию, потому что это включает просмотр более поздних чисел, и R правильно рассматривает имена переменных как символ.

library(dplyr)
library(purrr)
solution <- problem %>%
  mutate(current_status = pmap_chr(select(., contains("status")), ~
                                     case_when(any(str_detect(c(...), "(?i)Completed")) ~ "Completed",
                                               any(str_detect(c(...), "(?i)Registered")) ~ "Registered", 
                                               any(str_detect(c(...), "(?i)No Action")) | any(str_detect(c(...), "(?i)Withdrawn")) ~ "Not Taken",
                                               TRUE ~ "NA"))) 

Спасибо!

1 Ответ

3 голосов
/ 14 июня 2019

Вот один из способов использования apply и case_when.apply проходит по всем строкам problem по одному и вычисляет результат на основе case_when условий.

problem %>% 
 mutate(
   current = 
     apply(select(., starts_with("status")), 1, function(x) {
       case_when(
         "Completed" %in% x ~ "Completed",
         which.max(x=="Registered") > which.max(x %in% c("No Action","Withdrawn")) ~ "Registered",
         TRUE ~ "Not Taken"
       )
     })
  )

# A tibble: 3 x 5
  name   status_1   status_2   status_3   current   
  <chr>  <chr>      <chr>      <chr>      <chr>     
1 Angela Registered Withdrawn  No Action  Not Taken 
2 Claire No Action  No Action  Registered Registered
3 Justin Completed  Registered Withdrawn  Completed 

Вне трубы вы можете просто сделать -

problem$current <- select(problem, starts_with("status")) %>% 
  apply(., 1, function(x) {
    case_when(
      "Completed" %in% x ~ "Completed",
      which.max(x == "Registered") > which.max(x %in% c("No Action", "Withdrawn")) ~ "Registered",
      TRUE ~ "Not Taken"
    )
  })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...