This function allows you to vectorize multiple if_else() statements.
If no cases match, NA is returned.
This function derived from dplyr::case_when().
Unlike dplyr::case_when(), in_case() supports piping elegantly and
attempts to handle inconsistent types (see examples).
Usage
in_case(
...,
.preserve = FALSE,
.default = NA,
preserve = deprecated(),
default = deprecated()
)Arguments
- ...
<
dynamic-dots> A sequence of two-sided formulas. The left hand side (LHS) determines which values match this case. The right hand side (RHS) provides the replacement value.The LHS must evaluate to a logical vector.
Both LHS and RHS may have the same length of either 1 or
n. The value ofnmust be consistent across all cases. The case ofn == 0is treated as a variant ofn != 1.NULLinputs are ignored.- .preserve
If
TRUE, unmatched elements of the input will be returned unmodified. (The elements may have their type coerced to be compatible with replacement values.) IfFALSE, unmatched elements of the input will be replaced with.default. Defaults toFALSE.- .default
If
.preserveisFALSE, a value to replace unmatched elements of the input. Defaults toNA.- preserve, default
Value
A vector of length 1 or n, matching the length of the logical input or output vectors. Inconsistent lengths will generate an error.
See also
in_case_fct() to return a factor and
in_case_list() to return a list
switch_case() a simpler alternative for when each case involves
== or %in%
fn_case(), a simpler alternative for when each case uses the
same function
if_case(), a pipeable alternative to dplyr::if_else()
dplyr::case_when(), from which this function is derived
Examples
# Non-piped statements are handled the same as dplyr::case_when()
x <- 1:30
in_case(
x %% 15 == 0 ~ "fizz buzz",
x %% 3 == 0 ~ "fizz",
x %% 5 == 0 ~ "buzz",
TRUE ~ x
)
#> [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" "fizz" "22" "23" "fizz"
#> [25] "buzz" "26" "fizz" "28" "29" "fizz buzz"
# A vector can be directly piped into in_case() without error
1:30 %>%
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" "fizz" "22" "23" "fizz"
#> [25] "buzz" "26" "fizz" "28" "29" "fizz buzz"
# in_case() silently converts types
1:30 %>%
in_case(
. %% 15 == 0 ~ 35,
. %% 3 == 0 ~ 5,
. %% 5 == 0 ~ 7,
TRUE ~ NA
)
#> [1] NA NA 5 NA 7 5 NA NA 5 7 NA 5 NA NA 35 NA NA 5 NA 7 5 NA NA 5 7
#> [26] NA 5 NA NA 35
x <- 1:30
try(
dplyr::case_when(
x %% 15 == 0 ~ 35,
x %% 3 == 0 ~ 5,
x %% 5 == 0 ~ 7,
TRUE ~ NA
)
)
#> [1] NA NA 5 NA 7 5 NA NA 5 7 NA 5 NA NA 35 NA NA 5 NA 7 5 NA NA 5 7
#> [26] NA 5 NA NA 35
# .default and .preserve make it easier to handle unmatched values
1:30 %>%
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" "fizz" "pass" "pass" "fizz"
#> [25] "buzz" "pass" "fizz" "pass" "pass" "fizz buzz"
1:30 %>%
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" "fizz" "22" "23" "fizz"
#> [25] "buzz" "26" "fizz" "28" "29" "fizz buzz"
