0

So I have some old ifelse code (below) that I am trying to redo using case_when which I am failrly inexperienced with.

complete_data$type<-ifelse(grepl("Eneg",complete_data$Sample_code),"Negative",
                           ifelse(grepl("PCRneg",complete_data$Sample_code),"Negative",
                                  ifelse(grepl("DNApos",complete_data$Sample_code),"DNApositive",
                                         ifelse(grepl("PCRpos",complete_data$Sample_code),"PCRpositive",
                                         ifelse(grepl("Empty",complete_data$Sample_code),"Empty","Sample")))))

My initial attempt gets the first line working

complete_data$type <- case_when((grepl("Eneg", complete_data$Sample_code) ~ "Negative"))

But then my attempts to get the other ifelse statements in have all failed so far. Would anybody have any suggestions?

Any help would be appreciated

  • In order for us to help you, please provide a [reproducible example](https://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example). For example, to produce a minimal data set, you can use `head()`, `subset()`, or the indices. Then use `dput()` to give us something that can be put in R immediately. Also, please make sure you know what to do [when someone answers your question](https://stackoverflow.com/help/someone-answers). More info can be found at Stack Overflow's [help center](https://stackoverflow.com/help). Thank you! – iamericfletcher Nov 11 '20 at 13:08

2 Answers2

2

You can use str_detect/grepl for pattern matching and use case_when in the following way.

library(dplyr)
library(stringr)

complete_data %>%
  mutate(type = case_when(str_detect(Sample_code, 'Eneg|PCRneg') ~ 'Negative', 
                          str_detect(Sample_code, 'DNApos') ~ 'DNApositive', 
                          str_detect(Sample_code, 'PCRpos') ~ 'PCRpositive',
                          str_detect(Sample_code, 'Empty') ~ 'Empty', 
                          TRUE ~ 'Sample')) -> complete_data
Ronak Shah
  • 355,584
  • 18
  • 123
  • 178
0

An alternative without the additional stringr package would be:

libraries("tidyverse")
complete_data <- complete_data %>% mutate(type = case_when(
 grepl("Eneg", Sample_code) | grepl("PCRneg", Sample_code) ~ "Negative",
 grepl("DNApos", Sample_code) ~ "DNApositive"
 grepl("PCRpos", Sample_code) ~ "PCRpositive"
 grepl("Empty", Sample_code) ~ "Empty"
 TRUE ~ "Sample"
))