purrr pmap для чтения максимального имени столбца по номеру имени столбца - PullRequest
0 голосов
/ 17 июня 2019

У меня есть этот набор данных:

library(dpylr)
Problem<- tibble(name = c("Angela", "Claire", "Justin", "Bob", "Gil"),
                   status_1 = c("Registered", "No Action", "Completed", "Denied", "No Action"),
                   status_2 = c("Withdrawn", "No Action", "Registered", "No Action", "Exempt"),
                   status_3 = c("No Action", "Registered", "Withdrawn", "No Action", "No Action"))

Я хочу создать столбец, который имеет текущий статус каждого.Если человек когда-либо закончил курс, они завершены.Если они были освобождены, они исключены.Если они являются чем-то иным, кроме зарегистрированного (или заполненного или освобожденного), они «не приняты».Сложно то, что я хочу, чтобы в моем коде говорилось, что они были зарегистрированы ТОЛЬКО в том случае, если их последнее действие было зарегистрировано.Итак, это должно выглядеть так:

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

У меня есть этот код, и часть, которая не будет работать, это строка which.max ():

library(dplyr)
library(purrr)
library(stringr)
problem %>% 
  mutate(
    current =
      pmap_chr(select(., contains("status")), ~
        case_when(
          any(str_detect(c(...), "(?i)Completed")) ~ "Completed",
          any(str_detect(c(...), "(?i)Exempt")) | any(str_detect(c(...), "(?i)Incomplete")) ~ "Exclude",
          which.max(parse_number(colnames(.)) == "Registered") ~ "Registered",
          any(str_detect(c(...), "(?i)No Show")) | any(str_detect(c(...), "(?i)Denied")) | any(str_detect(c(...), "(?i)Cancelled")) | any(str_detect(c(...), "(?i)Waitlist Expired")) || any(str_detect(c(...), "(?i)Withdrawn")) ~ "Not Taken",
          TRUE ~ "NA"
        )
      )
  )

I 'Мы всячески пытались, чтобы R прочитал числа статуса, но я не могу понять это.Важно, чтобы я сохранил оставшуюся часть кода, особенно часть str_detect (), потому что, хотя мой пример данных чист, реальный набор данных имеет много строк состояния и много записей, которые выглядят как «ЗАВЕРШЕНО» и «завершено».

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

Спасибо!

1 Ответ

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

Сохраняя все как есть и имея дело только с вашей which.max проблемой, мы можем сделать

library(tidyverse)

Problem %>% 
    mutate(
       current =
         pmap_chr(select(., contains("status")), ~
             case_when(
               any(str_detect(c(...), "(?i)Completed")) ~ "Completed",
               any(str_detect(c(...), "(?i)Exempt")) | any(str_detect(c(...), "(?i)Incomplete")) ~ "Exclude",
               which.max(c(...) == "Registered") == length(c(...)) ~ "Registered",
               any(str_detect(c(...), "(?i)No Show")) | any(str_detect(c(...), "(?i)Denied")) | any(str_detect(c(...), "(?i)Cancelled")) | any(str_detect(c(...), "(?i)Waitlist Expired")) || any(str_detect(c(...), "(?i)Withdrawn")) ~ "Not Taken",
               TRUE ~ "NA"
             )
            )
       )

# 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 
#4 Bob    Denied     No Action  No Action  Not Taken 
#5 Gil    No Action  Exempt     No Action  Exempt  
...