Используйте case_when между столбцами, чтобы создать новый столбец - PullRequest
2 голосов
/ 03 июня 2019

У меня большой набор данных, который имеет много столбцов со статусом. Я хочу сделать новый столбец, который имеет текущий статус участников. Я пытаюсь использовать case_when в dplyr, но я не уверен, как перейти по столбцам. В наборе данных слишком много столбцов, чтобы я мог напечатать каждый столбец. Вот образец данных:

library(dplyr)
problem <- tibble(name = c("sally", "jane", "austin", "mike"),
                  status1 = c("registered", "completed", "registered", "no action"),
                  status2 = c("completed", "completed", "registered", "no action"),
                  status3 = c("completed", "completed", "withdrawn", "no action"),
                  status4 = c("withdrawn", "completed", "no action", "registered"))

Для кода мне нужен новый столбец, в котором указывается окончательный статус участников; ОДНАКО, если их статус когда-либо был завершен, то я хочу сказать, что он завершен, независимо от того, каков их окончательный статус. Для этих данных ответ будет выглядеть так:


answer <- tibble(name = c("sally", "jane", "austin", "mike"),
                 status1 = c("registered", "completed", "registered", "no action"),
                 status2 = c("completed", "completed", "registered", "no action"),
                 status3 = c("completed", "completed", "withdrawn", "no action"),
                 status4 = c("withdrawn", "completed", "no action", "registered"),
                 finalstatus = c("completed", "completed", "no action", "registered"))

Кроме того, если вы можете включить любое объяснение вашего кода, я был бы очень признателен! Если бы ваше решение могло также использовать содержимое («статус»), это было бы особенно полезно, потому что в моем реальном наборе данных столбцы состояния очень грязные (например, summary_status_5292019, sum_status_07012018 и т. Д.).

Спасибо!

Ответы [ 2 ]

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

Опция с pmap

library(tidyverse)
problem %>%
     mutate(finalstatus =  pmap_chr(select(., starts_with('status')), ~ 
       case_when(any(c(...) == "completed")~ "completed",
             any(c(...) == "withdrawn") ~ "no action", 
     TRUE ~ "registered")))
2 голосов
/ 03 июня 2019

Вот функция, которая выполняет такую ​​операцию «совпадение строк». Подобно case_when, вы можете поместить вектор checks в определенном порядке, чтобы при обнаружении совпадения для одного элемента, например, 'completed' в данных, совпадения на более поздних элементах не учитываются.

row_match <- function(data, checks, labels){
  matches <- match(unlist(data), checks)
  dim(matches) <- dim(data)
  labels[apply(matches, 1, min, na.rm = T)]
}

df %>% 
  mutate(final.stat = row_match(
                        data = select(df, starts_with('status')),
                        checks = c('completed', 'withdrawn', 'registered'),
                        labels = c('completed', 'no action', 'registered')))

# # A tibble: 4 x 6
#   name   status1    status2    status3   status4    final.stat
#   <chr>  <chr>      <chr>      <chr>     <chr>      <chr>     
# 1 sally  registered completed  completed withdrawn  completed 
# 2 jane   completed  completed  completed completed  completed 
# 3 austin registered registered withdrawn no action  no action 
# 4 mike   no action  no action  no action registered registered
...