# Between: Operators To Check, If a Value Lies Within Or Outside a Given... In DescTools: Tools for Descriptive Statistics

## Description

The between and outside operators are used to check, whether a vector of given values x lie within a defined range (or outside respectively). The values can be numbers, text or dates. Ordered factors are supported.

## Usage

 ``` 1 2 3 4 5 6 7 8 9 10 11 12``` ```x %()% rng x %(]% rng x %[)% rng x %[]% rng x %][% rng x %](% rng x %)[% rng x %)(% rng x %:% rng x %::% rng ```

## Arguments

 `x` is a variable with at least ordinal scale, usually a numeric value, but can be an ordered factor or a text as well. Texts would be treated alphabetically. `rng` a vector of two values or a matrix with 2 columns, defining the minimum and maximum of the range for x. If rng is a matrix, x or rng will be recycled.

## Details

The "BETWEEN" operators basically combine two conditional statements into one and simplify the query process.
They are merely a wrapper for: `x >= rng & x <= rng`, where the round bracket `(` means strictly greater (>) and the square bracket `[` means greater or equal (>=). Numerical values of x will be handled by C-code, which is significantly faster than two comparisons in R (especially when x is huge). .
`%][%` is the negation of `%()%`, meaning all values lying outside the given range. Elements on the limits will return `TRUE`.

Both arguments, `x` and `rng`, will be recycled to the highest dimension, which is either the length of the vector (`x`) or the number of rows of the matrix (`rng`).
See also the routines used to check, whether two ranges overlap (`Overlap`, `Interval`).

`%:%` returns all the elements of a vector between the (first found) element `rng` and `rng`. If no match is found it returns `NA`. If `rng` occurs before `rng` in the vector the elements will be returned in reverse order (which is the same behaviour as the `:` operator).
`%::%` does the same in greedy mood. It uses the first match for `from` and the last match for `to`.

## Value

A logical vector of the same length as x.

## Author(s)

Andri Signorell <andri@signorell.net> based on C-code by Kevin Ushey <kevinushey@gmail.com>

`if`, `ifelse`, `Comparison`, `Overlap`, `Interval`
 ``` 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71``` ```x <- 1:9 x %[]% c(3,5) # outside x <- 1:9 x %][% c(3,5) c(x,NA) %[]% c(3,5) x %(]% c(3,5) # no result when from > to: x %[]% c(5,3) x %(]% c(5,5) # no problem: ordered(x) %[]% c(3,5) # not meaningful: factor(x) %[]% c(3,5) # characters letters[letters %(]% c("d","h")] data(d.pizza) x <- levels(d.pizza\$driver) x %[]% c("C","G") # select diamonds with a price between 2400 and 2510 data(d.diamonds) d.diamonds[d.diamonds\$price %[]% c(2400,2510),] # use it with an ordered factor and select all diamonds with # symmetry between G (included) and X (excluded). mean(d.diamonds[d.diamonds\$symmetry %[)% c("G","X"),"price"]) # use multiple ranges 2 %[]% cbind(1:4,2:5) # both arguments are recycled c(2,3) %[]% cbind(1:4,2:5) # between operator for vector positions set.seed(4) (x <- sample(LETTERS, size=10, replace=TRUE)) #  "X" "K" "S" "C" "G" "L" "S" "V" "U" "Z" # return all elements between "S" and "L" x %:% c("S","L") #  "S" "C" "G" "L" x %:% c("S","A") #  "S" "C" "G" "L" "S" "V" "U" "Z" x %:% c("A","S") #  "X" "K" "S" # reverted matches return the elements in reverse order x %:% c("G","X") #  "G" "C" "S" "K" "X" # no match results in NA x %:% c("Y","B") (x <- c("B", "A", "X", "K", "S", "K", "G", "L", "K", "V", "K", "Z")) # lazy x %:% c("A", "K") # greedy x %::% c("A", "K") ```