Я хочу использовать 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")))
Спасибо!