case_when

0th

Percentile

A general vectorised if.

This function allows you to vectorise mutiple if and else if statements. It is an R equivalent of the SQL CASE WHEN statement.

Usage
case_when(...)
Arguments
...

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. Each logical vector can either have length 1 or a common length. All RHSs must evaluate to the same type of vector.

Value

A vector as long as the longest LHS, with the type (and attributes) of the first RHS. Inconsistent lengths of types will generate an error.

Aliases
  • case_when
Examples
library(dplyr) x <- 1:50 case_when( x %% 35 == 0 ~ "fizz buzz", x %% 5 == 0 ~ "fizz", x %% 7 == 0 ~ "buzz", TRUE ~ as.character(x) ) # Like an if statement, the arguments are evaluated in order, so you must # proceed from the most specific to the most general. This won't work: case_when( TRUE ~ as.character(x), x %% 5 == 0 ~ "fizz", x %% 7 == 0 ~ "buzz", x %% 35 == 0 ~ "fizz buzz" )
Documentation reproduced from package dplyr, version 0.5.0, License: MIT + file LICENSE

Community examples

alexey.shiklomanov@gmail.com at Oct 19, 2017 dplyr v0.7.3

# Complex example ```r iris <- tibble::as_tibble(iris) ``` ## Direct entry ```r cases_uq <- list( !! Sepal.Length > 5.5 ~ "long", !! Sepal.Length > 5 ~ "medium", TRUE ~ "short" ) iris2 <- dplyr::mutate(iris, sepal_category = dplyr::case_when(!!! cases_uq)) dplyr::summarize( dplyr::group_by(iris2, sepal_category), mean = mean(Sepal.Length) ) # # A tibble: 3 x 2 #sepal_category mean #<chr> <dbl> # 1 long 6.378022 # 2 medium 5.292593 # 3 short 4.787500 ``` ## Variable as string ```r my_column <- "Sepal.Length" cases_q <- list( !! get(my_column) > 5.5 ~ "long", !! get(my_column) > 5 ~ "medium", TRUE ~ "short" ) iris2 <- dplyr::mutate(iris, sepal_category = dplyr::case_when(!!! cases_q)) dplyr::summarize( dplyr::group_by(iris2, sepal_category), mean = mean(Sepal.Length) ) # # A tibble: 3 x 2 #sepal_category mean #<chr> <dbl> # 1 long 6.378022 # 2 medium 5.292593 # 3 short 4.787500 ``` ## Function ```r summary_function <- function(my_column) { cases <- list( !! get(my_column) > 5.5 ~ "long", !! get(my_column) > 5 ~ "medium", TRUE ~ "short" ) iris2 <- dplyr::mutate(iris, group = dplyr::case_when(!!! cases)) dplyr::summarize( dplyr::group_by(iris2, group), mean = mean(!! rlang::sym(my_column)) ) } summary_function("Sepal.Length") # # A tibble: 3 x 2 # group mean # <chr> <dbl> # 1 long 6.378022 # 2 medium 5.292593 # 3 short 4.787500 summary_function("Petal.Length") # # A tibble: 3 x 2 # group mean # <chr> <dbl> # 1 long 5.992000 # 2 medium 5.241176 # 3 short 3.007407 ```