【发布时间】:2019-10-29 09:19:49
【问题描述】:
我想在 dplyr 中使用 case_when() 来创建一个新的分类列,说明一个人在培训中的当前状态。
我有一个看起来像这样的小标题:
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"))
如果此人曾经完成过课程,则他们的状态应该是完成(即使他们在以后不小心再次注册了该课程,作为本例中 Justin 的证据)。如果他们尚未完成课程,则应注册他们的状态并且以后的状态不会撤消该课程,例如“不采取行动”或“撤回”。如果他们已经完成,他们应该是状态“未采取”什么都没有,或者在他们注册之后撤回。
在本例中,最终数据集应如下所示:
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"))
贾斯汀完成了,因为他在任何时候完成了课程。安吉拉没有被带走,因为她取消了注册。 Claire 已注册,因为她的最远身份已注册。
这是我目前所拥有的。它正确地分类了贾斯汀和克莱尔,但错误地分类了安吉拉。我理解为什么它确实对她进行了错误分类,但我不知道如何进行注册,因为它涉及查看后面的数字,并且 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")))
谢谢!
【问题讨论】:
标签: r dplyr conditional-statements purrr