incase
incase provides a more pipe-friendly alternative to
dplyr’s
case_when()
and if_else()
.
Installation
You can install the development version of incase from GitHub with:
# install.packages("remotes")
remotes::install_github("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 NA
s.
x <- -1:5
# Replace -1 with NA
dplyr::case_when(x == -1 ~ NA, TRUE ~ x)
#> Error: must be a logical vector, not an integer vector.
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)
#> Error: must be a double vector, not an integer vector.
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 NA
s 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] "D" "R" "I" "L" "D" "D" "D" NA "R" "D" "G" "I" NA NA "I" "I" "D" "I" "D"
#> [20] "D"
parties %>%
in_case(
. == "D" ~ "Democratic",
. == "R" ~ "Republican",
. %in% c("G", "L") ~ "Other",
. %in% c("I", NA) ~ "Independent"
)
#> [1] "Democratic" "Republican" "Independent" "Other" "Democratic"
#> [6] "Democratic" "Democratic" "Independent" "Republican" "Democratic"
#> [11] "Other" "Independent" "Independent" "Independent" "Independent"
#> [16] "Independent" "Democratic" "Independent" "Democratic" "Democratic"
parties %>%
switch_case(
"D" ~ "Democrat",
"R" ~ "Republican",
c("G", "L") ~ "Other",
c("I", NA) ~ "Independent"
)
#> [1] "Democrat" "Republican" "Independent" "Other" "Democrat"
#> [6] "Democrat" "Democrat" "Independent" "Republican" "Democrat"
#> [11] "Other" "Independent" "Independent" "Independent" "Independent"
#> [16] "Independent" "Democrat" "Independent" "Democrat" "Democrat"
Hex sticker fonts are Source Code Pro 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.