incase v0.1.0

0

Monthly downloads

0th

Percentile

Pipe-Friendly Vector Replacement with Case Statements

Offers a pipe-friendly alternative to the 'dplyr' functions case_when() and if_else(). 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 possible outputs to the same type, meaning you no longer have to worry about using specific typed variants of NA or explicitly declaring integer outputs.

Readme

incase

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 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 NAs.

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 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] "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.

Functions in incase

Name Description
if_case Pipe-friendly vectorized if
%>% Pipe operator
switch_case Switch-style recoding of values
in_case A pipe-friendly general vectorized if
incase-package incase: Pipe-Friendly Vector Replacement with Case Statements
No Results!

Last month downloads

Details

Type Package
License MIT + file LICENSE
URL https://incase.rossellhayes.com, https://github.com/rossellhayes/incase
BugReports https://github.com/rossellhayes/incase/issues
Encoding UTF-8
LazyData true
RoxygenNote 7.1.1
NeedsCompilation no
Packaged 2020-09-08 01:46:48 UTC; Alex
Repository CRAN
Date/Publication 2020-09-15 10:00:06 UTC

Include our badge in your README

[![Rdoc](http://www.rdocumentation.org/badges/version/incase)](http://www.rdocumentation.org/packages/incase)