Skip to content

Pipe-Friendly Vector Replacement with Case Statements

License

Unknown, Unknown licenses found

Licenses found

Unknown
LICENSE
Unknown
LICENSE.md
Notifications You must be signed in to change notification settings

rossellhayes/incase

Folders and files

NameName
Last commit message
Last commit date

Latest commit

3cbec42 · Jul 10, 2024
Jul 21, 2023
Jul 10, 2024
Jul 24, 2023
Jul 24, 2023
Sep 8, 2020
Jul 10, 2024
Mar 27, 2021
Mar 27, 2021
Sep 8, 2020
Dec 2, 2020
Sep 1, 2020
Mar 8, 2024
Jul 24, 2020
Jul 24, 2020
Jul 25, 2023
Jul 10, 2024
Aug 21, 2023
Aug 21, 2023
Jul 25, 2023
Jul 25, 2023
Jul 24, 2020

Repository files navigation

incase

r-universe status badge License: MIT R build status

incase provides a more pipe-friendly alternative to dplyr’s case_when() and if_else().

Installation

You can install the released version of incase from CRAN with:

install.packages("incase")

or the development version from GitHub with:

# install.packages("pak")
pak::pkg_install("rossellhayes/incase")

Usage

Pipe-friendly conditionals

incase’s in_case() and if_case() accept a vector as their first input, allowing you to take full advantage of magrittr’s .

1:20 %>%
  in_case(
    . %% 15 == 0 ~ "fizz buzz",
    . %%  3 == 0 ~ "fizz",
    . %%  5 == 0 ~ "buzz",
    TRUE         ~ .
  )
#>  [1] "1"         "2"         "fizz"      "4"         "buzz"      "fizz"     
#>  [7] "7"         "8"         "fizz"      "buzz"      "11"        "fizz"     
#> [13] "13"        "14"        "fizz buzz" "16"        "17"        "fizz"     
#> [19] "19"        "buzz"

1:20 %>% if_case(. %% 3 == 0, "fizz", .)
#>  [1] "1"    "2"    "fizz" "4"    "5"    "fizz" "7"    "8"    "fizz" "10"  
#> [11] "11"   "fizz" "13"   "14"   "fizz" "16"   "17"   "fizz" "19"   "20"

Automatic type conversion

incase functions automatically coerce types. This is especially useful when dealing with integers or NAs.

x <- -1:5

# Replace -1 with NA
dplyr::case_when(x == -1 ~ NA, TRUE ~ x)
#> [1] NA  0  1  2  3  4  5
dplyr::case_when(x == -1 ~ NA_integer_, TRUE ~ x)
#> [1] NA  0  1  2  3  4  5
in_case(x == -1 ~ NA, TRUE ~ x)
#> [1] NA  0  1  2  3  4  5

# Replace -1 with 0
dplyr::case_when(x == -1 ~ 0, TRUE ~ x)
#> [1] 0 0 1 2 3 4 5
dplyr::case_when(x == -1 ~ 0L, TRUE ~ x)
#> [1] 0 0 1 2 3 4 5
in_case(x == -1 ~ 0, TRUE ~ x)
#> [1] 0 0 1 2 3 4 5

With incase, you no longer have to worry about specifying the type of your NAs or adding L to your integers.

Easy default values

in_case() adds preserve and default arguments as a more intuitive alternative to TRUE ~ ....*

1:20 %>%
  in_case(
    . %% 15 == 0 ~ "fizz buzz",
    . %%  3 == 0 ~ "fizz",
    . %%  5 == 0 ~ "buzz"
  )
#>  [1] NA          NA          "fizz"      NA          "buzz"      "fizz"     
#>  [7] NA          NA          "fizz"      "buzz"      NA          "fizz"     
#> [13] NA          NA          "fizz buzz" NA          NA          "fizz"     
#> [19] NA          "buzz"

1:20 %>%
  in_case(
    . %% 15 == 0 ~ "fizz buzz",
    . %%  3 == 0 ~ "fizz",
    . %%  5 == 0 ~ "buzz",
    preserve     = TRUE
  )
#>  [1] "1"         "2"         "fizz"      "4"         "buzz"      "fizz"     
#>  [7] "7"         "8"         "fizz"      "buzz"      "11"        "fizz"     
#> [13] "13"        "14"        "fizz buzz" "16"        "17"        "fizz"     
#> [19] "19"        "buzz"

1:20 %>%
  in_case(
    . %% 15 == 0 ~ "fizz buzz",
    . %%  3 == 0 ~ "fizz",
    . %%  5 == 0 ~ "buzz",
    default      = "pass"
  )
#>  [1] "pass"      "pass"      "fizz"      "pass"      "buzz"      "fizz"     
#>  [7] "pass"      "pass"      "fizz"      "buzz"      "pass"      "fizz"     
#> [13] "pass"      "pass"      "fizz buzz" "pass"      "pass"      "fizz"     
#> [19] "pass"      "buzz"

Simplified interface for recoding

switch_case() works as a convenient shorthand for in_case() when recoding discrete values.

parties
#>  [1] "G" "I" "D" "I" "R" "D" "L" "D" NA  "L" NA  "G" "R" NA  "G" NA  "L" "D" "D"
#> [20] "I"

parties %>%
  switch_case(
    "D"         ~ "Democrat",
    "R"         ~ "Republican",
    c("G", "L") ~ "Other",
    c("I", NA)  ~ "Independent"
  )
#>  [1] "Other"       "Independent" "Democrat"    "Independent" "Republican" 
#>  [6] "Democrat"    "Other"       "Democrat"    "Independent" "Other"      
#> [11] "Independent" "Other"       "Republican"  "Independent" "Other"      
#> [16] "Independent" "Other"       "Democrat"    "Democrat"    "Independent"

grep_case() allows you to recode values with pattern matching.

countries <- c(
  "France", "Ostdeutschland", "Westdeutschland", "Nederland",
  "België (Vlaanderen)", "Belgique (Wallonie)", "Luxembourg", "Italia"
)

grep_case(
  countries,
  "Deutschland" ~ "Germany",
  "Belg"        ~ "Belgium",
  "Nederland"   ~ "Netherlands",
  "Italia"      ~ "Italy",
  preserve      = TRUE,
  ignore.case   = TRUE
)
#> [1] "France"      "Germany"     "Germany"     "Netherlands" "Belgium"    
#> [6] "Belgium"     "Luxembourg"  "Italy"

Easily recode to (ordered) factor

When you need an ordered factor, the *_fct() family of functions lets you save a step by using the order of your cases as the order of your factor levels. Use ordered = TRUE to create an ordered factor and ordered = FALSE to make a regular-old factor.

data <- runif(10, 0, 10)
data
#>  [1] 3.9075340 7.4098608 2.1540250 8.4599089 3.0487929 8.9268192 9.9001603
#>  [8] 9.2022173 0.3128016 5.2452107

data %>% 
  in_case_fct(
    . < 3   ~ "Low",
    . < 7   ~ "Medium",
    default = "High",
    ordered = TRUE
  )
#>  [1] Medium High   Low    High   Medium High   High   High   Low    Medium
#> Levels: Low < Medium < High

parties %>%
  switch_case_fct(
    "D"         ~ "Democrat",
    "R"         ~ "Republican",
    c("G", "L") ~ "Other",
    c("I", NA)  ~ "Independent"
  )
#>  [1] Other       Independent Democrat    Independent Republican  Democrat   
#>  [7] Other       Democrat    Independent Other       Independent Other      
#> [13] Republican  Independent Other       Independent Other       Democrat   
#> [19] Democrat    Independent
#> Levels: Democrat Republican Other Independent

Hex sticker fonts are Source Sans by Adobe and Hasklig by Ian Tuomi.

Please note that incase is released with a Contributor Code of Conduct. By contributing to this project, you agree to abide by its terms.

* Intuitiveness may vary from person to person.