Home > Back-end >  How can I rewrite in a more efficient way str_detect()?
How can I rewrite in a more efficient way str_detect()?

Time:11-05

mutate(method = cur_group_id(),
           method = paste0("M", method)) %>% 
    mutate(method = case_when(
      str_detect(variable, "testhc35") ~ "M2",
      str_detect(variable, "testhc36") ~ "M2",
      str_detect(variable, "testhc37") ~ "M2",
      str_detect(variable, "testhi1") ~ "M2",
      str_detect(variable, "testhi2") ~ "M2",
      str_detect(variable, "testhi3") ~ "M2",
      method == "M1" ~ "M1",
      str_detect(variable, "testhc38") ~ "M3",
      str_detect(variable, "testhc39") ~ "M3",
      str_detect(variable, "testhc40") ~ "M3",
      str_detect(variable, "testhi4") ~ "M3",
      str_detect(variable, "testhi5") ~ "M3",
      str_detect(variable, "testhi6") ~ "M3")) %>% 
    unite(method_trait, c("method", "trait"), sep = "")

I believe I can detect the first 6 rows with str_detect() altogether and then the final 6 rows as one row. But I am not sure how to do it.

CodePudding user response:

You can be conciser with ranges:

...
str_detect(variable, "testhc3[5-7]")  ~ "M2",
str_detect(variable, "testhi[1-3]")   ~ "M2",
method == "M1"                        ~ "M1",
str_detect(variable, "testhc3[8-9]")  ~ "M3",
str_detect(variable, "testhc40")      ~ "M3"
str_detect(variable, "testhi[4-6]")   ~ "M3"
...

Then you could mix-in the or (|) operator:

...
str_detect(variable, "testh(c3[5-7]|i[1-3])")      ~ "M2",
method == "M1"                                     ~ "M1",
str_detect(variable, "testh(c3[8-9]|i[4-6]|c40)")  ~ "M3",
...
  • Related