case_when с частичным совпадением строки и содержит () - PullRequest
1 голос
/ 13 июня 2019

Я работаю с набором данных, который имеет много столбцов, называемых status1, status2 и т. Д. В этих столбцах говорится, что кто-то освобожден, завершен, зарегистрирован и т. Д.

К сожалению, входные данные освобожденыне соответствует;Вот пример:

library(dplyr)

problem <- tibble(person = c("Corey", "Sibley", "Justin", "Ruth"),
                  status1 = c("7EXEMPT", "Completed", "Completed", "Pending"),
                  status2 = c("exempt", "Completed", "Completed", "Pending"),
                  status3 = c("EXEMPTED", "Completed", "Completed", "ExempT - 14"))

Я пытаюсь использовать case_when (), чтобы создать новый столбец с окончательным статусом.Если это когда-либо говорит, завершено, то они завершены.Если он когда-либо говорит, что освобожден, не говоря, полный, то они освобождаются.

Важной частью является то, что я хочу, чтобы мой код содержал («status») или какой-то эквивалент, который предназначен только для столбцов статуса и не требует их ввода, и я хочу, чтобы он требовал толькочастичное совпадение строк для исключения.

Что касается использования содержимого с case_when, я видел этот пример, но я не смог применить его к своему случаю: мутировать с case_when и содержит

Это то, что я пытался использовать до сих пор, но, как вы можете догадаться, это не сработало:

library(purrr)
library(dplyr)
library(stringr)
solution <- problem %>%
  mutate(final= case_when(pmap_chr(select(., contains("status")), ~
    any(c(...) == str_detect(., "Exempt") ~ "Exclude",
               TRUE ~ "Complete"
  ))))

Вот как я хочу, чтобы конечный продукт выглядел так:

solution <- tibble(person = c("Corey", "Sibley", "Justin", "Ruth"),
                   status1 = c("7EXEMPT", "Completed", "Completed", "Pending"),
                   status2 = c("exempt", "Completed", "Completed", "Pending"),
                   status3 = c("EXEMPTED", "Completed", "Completed", "ExempT - 14"),
                   final = c("Exclude", "Completed", "Completed", "Exclude")) 

Спасибо!

1 Ответ

2 голосов
/ 13 июня 2019

Я думаю, что вы делаете это задом наперед. Поместите case_when внутрь pmap_chr, а не наоборот:

library(dplyr)
library(purrr)
library(stringr)

problem %>%
  mutate(final = pmap_chr(select(., contains("status")), 
                          ~ case_when(any(str_detect(c(...), "(?i)Exempt")) ~ "Exclude",
                                      TRUE ~ "Completed")))

Для каждой итерации pmap (каждая строка набора данных problem) мы хотим использовать case_when, чтобы проверить, существует ли строка Exempt. (?i) в str_detect делает его нечувствительным к регистру. Это то же самое, что написать str_detect(c(...), regex("Exempt", ignore_case = TRUE))

Выход:

# A tibble: 4 x 5
  person status1   status2   status3     final    
  <chr>  <chr>     <chr>     <chr>       <chr>    
1 Corey  7EXEMPT   exempt    EXEMPTED    Exclude  
2 Sibley Completed Completed Completed   Completed
3 Justin Completed Completed Completed   Completed
4 Ruth   Pending   Pending   ExempT - 14 Exclude
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...