Multiple patterns using str_remove

Hi, I would like to ask for advice using str_remove(). Ideally I would like to remove multiple patterns e.g. c(“ale”, “emale”) in the example below in one-go so I can code more efficiently.

Any help is appreciated. Thanks.

# load package
pacman::p_load(rio, janitor, datapasta, reprex, tidyverse)

# sample data
sample_case <- data.frame(
  stringsAsFactors = FALSE,
                                           pid = c("9174d755abce7fb7",
                                                   "469fd41756126126","9fb6d7c3a1be6987",
                                                   "6b2c6f9d5980edb8",
                                                   "4c3ebec8e4794bee","4c3ebec8e4794bee",
                                                   "53cce1871a2312a3",
                                                   "2b6134374e2562cf","2b6134374e2562cf",
                                                   "dc1f54eccf6a0588",
                                                   "31efca4ba6f5a9c3",
                                                   "fce6873a45ec882c","921adccf06d6655a",
                                                   "921adccf06d6655a",
                                                   "0a7c27f26b2cc7e4","dc8c3242bb6feb18",
                                                   "dc8c3242bb6feb18",
                                                   "1f85240bbee6f7ca","20f66ccc3c631640",
                                                   "8c8b8aa37887e5c9"),
                                   case_gender = c("Male","Female","Female",
                                                   "Male","Female","Female","Male",
                                                   "Female","Female",
                                                   "Female","Male","Female","Female",
                                                   "Female","Male","Male",
                                                   "Male","Male","Female",
                                                   "Female"))

# data cleaning
sample_case = sample_case %>% 
  mutate(gender_short = str_remove(case_gender, "ale"),
         gender_short = str_remove(gender_short, "em"))

sample_case
#>                 pid case_gender gender_short
#> 1  9174d755abce7fb7        Male            M
#> 2  469fd41756126126      Female            F
#> 3  9fb6d7c3a1be6987      Female            F
#> 4  6b2c6f9d5980edb8        Male            M
#> 5  4c3ebec8e4794bee      Female            F
#> 6  4c3ebec8e4794bee      Female            F
#> 7  53cce1871a2312a3        Male            M
#> 8  2b6134374e2562cf      Female            F
#> 9  2b6134374e2562cf      Female            F
#> 10 dc1f54eccf6a0588      Female            F
#> 11 31efca4ba6f5a9c3        Male            M
#> 12 fce6873a45ec882c      Female            F
#> 13 921adccf06d6655a      Female            F
#> 14 921adccf06d6655a      Female            F
#> 15 0a7c27f26b2cc7e4        Male            M
#> 16 dc8c3242bb6feb18        Male            M
#> 17 dc8c3242bb6feb18        Male            M
#> 18 1f85240bbee6f7ca        Male            M
#> 19 20f66ccc3c631640      Female            F
#> 20 8c8b8aa37887e5c9      Female            F
1 Like

Hello,

I wouldn’t recommend doing this with str_remove(), rather, I would use case_match() as seen below:

# loading packages
library(tidyverse)

# creating fake data
sample_case <- data.frame(
  stringsAsFactors = FALSE,
  pid = c(
    "9174d755abce7fb7",
    "469fd41756126126", "9fb6d7c3a1be6987",
    "6b2c6f9d5980edb8",
    "4c3ebec8e4794bee", "4c3ebec8e4794bee",
    "53cce1871a2312a3",
    "2b6134374e2562cf", "2b6134374e2562cf",
    "dc1f54eccf6a0588",
    "31efca4ba6f5a9c3",
    "fce6873a45ec882c", "921adccf06d6655a",
    "921adccf06d6655a",
    "0a7c27f26b2cc7e4", "dc8c3242bb6feb18",
    "dc8c3242bb6feb18",
    "1f85240bbee6f7ca", "20f66ccc3c631640",
    "8c8b8aa37887e5c9"
  ),
  case_gender = c(
    "Male", "Female", "Female",
    "Male", "Female", "Female", "Male",
    "Female", "Female",
    "Female", "Male", "Female", "Female",
    "Female", "Male", "Male",
    "Male", "Male", "Female",
    "Female"
  )
)

# data cleaning
sample_case |>
    mutate(gender_short = case_match(case_gender, "Male" ~ "M", "Female" ~ "F", .default = NA_character_))
#>                 pid case_gender gender_short
#> 1  9174d755abce7fb7        Male            M
#> 2  469fd41756126126      Female            F
#> 3  9fb6d7c3a1be6987      Female            F
#> 4  6b2c6f9d5980edb8        Male            M
#> 5  4c3ebec8e4794bee      Female            F
#> 6  4c3ebec8e4794bee      Female            F
#> 7  53cce1871a2312a3        Male            M
#> 8  2b6134374e2562cf      Female            F
#> 9  2b6134374e2562cf      Female            F
#> 10 dc1f54eccf6a0588      Female            F
#> 11 31efca4ba6f5a9c3        Male            M
#> 12 fce6873a45ec882c      Female            F
#> 13 921adccf06d6655a      Female            F
#> 14 921adccf06d6655a      Female            F
#> 15 0a7c27f26b2cc7e4        Male            M
#> 16 dc8c3242bb6feb18        Male            M
#> 17 dc8c3242bb6feb18        Male            M
#> 18 1f85240bbee6f7ca        Male            M
#> 19 20f66ccc3c631640      Female            F
#> 20 8c8b8aa37887e5c9      Female            F

Created on 2024-03-08 with reprex v2.1.0

Session info
sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.3.1 (2023-06-16)
#>  os       macOS Ventura 13.6.3
#>  system   x86_64, darwin20
#>  ui       X11
#>  language (EN)
#>  collate  en_US.UTF-8
#>  ctype    en_US.UTF-8
#>  tz       America/Toronto
#>  date     2024-03-08
#>  pandoc   3.1.1 @ /Applications/RStudio.app/Contents/Resources/app/quarto/bin/tools/ (via rmarkdown)
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package     * version date (UTC) lib source
#>  cli           3.6.2   2023-12-11 [1] CRAN (R 4.3.0)
#>  colorspace    2.1-0   2023-01-23 [1] CRAN (R 4.3.0)
#>  digest        0.6.34  2024-01-11 [1] RSPM (R 4.3.0)
#>  dplyr       * 1.1.4   2023-11-17 [1] CRAN (R 4.3.0)
#>  evaluate      0.23    2023-11-01 [1] CRAN (R 4.3.0)
#>  fansi         1.0.6   2023-12-08 [1] CRAN (R 4.3.0)
#>  fastmap       1.1.1   2023-02-24 [1] CRAN (R 4.3.0)
#>  forcats     * 1.0.0   2023-01-29 [1] CRAN (R 4.3.0)
#>  fs            1.6.3   2023-07-20 [1] CRAN (R 4.3.0)
#>  generics      0.1.3   2022-07-05 [1] CRAN (R 4.3.0)
#>  ggplot2     * 3.5.0   2024-02-23 [1] RSPM (R 4.3.0)
#>  glue          1.7.0   2024-01-09 [1] RSPM (R 4.3.0)
#>  gtable        0.3.4   2023-08-21 [1] CRAN (R 4.3.0)
#>  hms           1.1.3   2023-03-21 [1] CRAN (R 4.3.0)
#>  htmltools     0.5.7   2023-11-03 [1] CRAN (R 4.3.0)
#>  knitr         1.45    2023-10-30 [1] CRAN (R 4.3.0)
#>  lifecycle     1.0.4   2023-11-07 [1] CRAN (R 4.3.0)
#>  lubridate   * 1.9.3   2023-09-27 [1] CRAN (R 4.3.0)
#>  magrittr      2.0.3   2022-03-30 [1] CRAN (R 4.3.0)
#>  munsell       0.5.0   2018-06-12 [1] CRAN (R 4.3.0)
#>  pillar        1.9.0   2023-03-22 [1] CRAN (R 4.3.0)
#>  pkgconfig     2.0.3   2019-09-22 [1] CRAN (R 4.3.0)
#>  purrr       * 1.0.2   2023-08-10 [1] CRAN (R 4.3.0)
#>  R.cache       0.16.0  2022-07-21 [1] CRAN (R 4.3.0)
#>  R.methodsS3   1.8.2   2022-06-13 [1] CRAN (R 4.3.0)
#>  R.oo          1.26.0  2024-01-24 [1] RSPM (R 4.3.0)
#>  R.utils       2.12.3  2023-11-18 [1] CRAN (R 4.3.0)
#>  R6            2.5.1   2021-08-19 [1] CRAN (R 4.3.0)
#>  readr       * 2.1.5   2024-01-10 [1] RSPM (R 4.3.0)
#>  reprex        2.1.0   2024-01-11 [1] RSPM (R 4.3.0)
#>  rlang         1.1.3   2024-01-10 [1] RSPM (R 4.3.0)
#>  rmarkdown     2.25    2023-09-18 [1] CRAN (R 4.3.0)
#>  rstudioapi    0.15.0  2023-07-07 [1] CRAN (R 4.3.0)
#>  scales        1.3.0   2023-11-28 [1] CRAN (R 4.3.0)
#>  sessioninfo   1.2.2   2021-12-06 [1] CRAN (R 4.3.0)
#>  stringi       1.8.3   2023-12-11 [1] CRAN (R 4.3.0)
#>  stringr     * 1.5.1   2023-11-14 [1] CRAN (R 4.3.0)
#>  styler        1.10.2  2023-08-29 [1] CRAN (R 4.3.0)
#>  tibble      * 3.2.1   2023-03-20 [1] CRAN (R 4.3.0)
#>  tidyr       * 1.3.1   2024-01-24 [1] RSPM (R 4.3.0)
#>  tidyselect    1.2.0   2022-10-10 [1] CRAN (R 4.3.0)
#>  tidyverse   * 2.0.0   2023-02-22 [1] CRAN (R 4.3.0)
#>  timechange    0.3.0   2024-01-18 [1] RSPM (R 4.3.0)
#>  tzdb          0.4.0   2023-05-12 [1] CRAN (R 4.3.0)
#>  utf8          1.2.4   2023-10-22 [1] CRAN (R 4.3.0)
#>  vctrs         0.6.5   2023-12-01 [1] CRAN (R 4.3.0)
#>  withr         3.0.0   2024-01-16 [1] RSPM (R 4.3.0)
#>  xfun          0.42    2024-02-08 [1] RSPM (R 4.3.0)
#>  yaml          2.3.8   2023-12-11 [1] CRAN (R 4.3.0)
#> 
#>  [1] /Users/timothychisamore/Library/R/x86_64/4.3/library
#>  [2] /Library/Frameworks/R.framework/Versions/4.3-x86_64/Resources/library
#> 
#> ──────────────────────────────────────────────────────────────────────────────

All the best,

Tim

Thanks for your suggestion Tim. In a slightly more complex scenario. say for instance if c(‘male’, ‘MALE’ , ‘Male’, ‘Men’, ‘Man’) all presents ‘M’ in the column that we want, would it still be advisable to use case_when()?

Best wishes,
YW

1 Like

Hi YW,

I would continue to use the case_match() function in this scenario, for example:

case_match(gender, c("male", "MALE", "Men", "Man") ~ "M", c("female", "FEMALE", "Women", "Woman") ~ "F"), .default = NA_character_)

In the scenario above, I would probably first convert the gender variable to all uppercase, lowercase, or titlecase to prevent duplication, as well.

All the best,

Tim

1 Like