Offers a pipe-friendly alternative to the 'dplyr' functions case_when() and if_else(), as well as a number of user-friendly simplifications for common use cases. These functions accept a vector as an optional first argument, allowing conditional statements to be built using the 'magrittr' dot operator. The functions also coerce all outputs to the same type, meaning you no longer have to worry about using specific typed variants of NA or explicitly declaring integer outputs, and evaluate outputs somewhat lazily, so you don't waste time on long operations that won't be used.

incase provides a more pipe-friendly alternative to
dplyr’s
case_when()
and if_else().
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")
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"
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.
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"
switch_case() works as a convenient shorthand for in_case() when
recoding discrete values.
parties
#> [1] "R" "I" "R" "R" "D" "G" "I" "D" "G" "G" "I" "D" NA "I" "I" "R" NA "I" "G"
#> [20] "R"
parties %>%
switch_case(
"D" ~ "Democrat",
"R" ~ "Republican",
c("G", "L") ~ "Other",
c("I", NA) ~ "Independent"
)
#> [1] "Republican" "Independent" "Republican" "Republican" "Democrat"
#> [6] "Other" "Independent" "Democrat" "Other" "Other"
#> [11] "Independent" "Democrat" "Independent" "Independent" "Independent"
#> [16] "Republican" "Independent" "Independent" "Other" "Republican"
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"
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] 8.4454267 1.6049231 0.5227919 2.3271123 8.1508663 2.2252478 3.8852771
#> [8] 9.6029983 4.8355979 9.6592282
data %>%
in_case_fct(
. < 3 ~ "Low",
. < 7 ~ "Medium",
.default = "High",
.ordered = TRUE
)
#> [1] High Low Low Low High Low Medium High Medium High
#> Levels: Low < Medium < High
parties %>%
switch_case_fct(
"D" ~ "Democrat",
"R" ~ "Republican",
c("G", "L") ~ "Other",
c("I", NA) ~ "Independent"
)
#> [1] Republican Independent Republican Republican Democrat Other
#> [7] Independent Democrat Other Other Independent Democrat
#> [13] Independent Independent Independent Republican Independent Independent
#> [19] Other Republican
#> 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.