Используйте case_when в столбцах, чтобы создать новый столбец

У меня есть большой набор данных, в котором много столбцов со статусом. Я хочу создать новую колонку с текущим статусом участников. Я пытаюсь использовать 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"))

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

Спасибо!


person J.Sabree    schedule 03.06.2019    source источник


Ответы (2)


Вариант с 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")))
person akrun    schedule 03.06.2019
comment
Спасибо, @akrun! Можете ли вы объяснить, что означает c (...) или где я могу узнать о нем больше? Опять же, я ценю ваше время! - person J.Sabree; 03.06.2019
comment
@ J.Sabree pmap выбирает данные по строкам, c - для объединения элементов (...) в этой строке с вектором - person akrun; 03.06.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
person IceCreamToucan    schedule 03.06.2019