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 NA
s.
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 NA
s 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] "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"
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.
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.