# between

##### Convenience functions for range subsets.

Intended for use in `i`

in `[.data.table`

.

`between`

is equivalent to `lower<=x & x<=upper`

when
`incbounds=TRUE`

, or `lower<x & y<upper`

when `FALSE`

. With a caveat that
`NA`

in `lower`

or `upper`

are taken as unlimited bounds not `NA`

.
This can be changed by setting `NAbounds`

to `NA`

.

`inrange`

checks whether each value in `x`

is in between any of
the intervals provided in `lower,upper`

.

- Keywords
- data

##### Usage

```
between(x, lower, upper, incbounds=TRUE, NAbounds=TRUE, check=FALSE)
x %between% y
```inrange(x, lower, upper, incbounds=TRUE)
x %inrange% y

##### Arguments

- x
Any orderable vector, i.e., those with relevant methods for

``<=``

, such as`numeric`

,`character`

,`Date`

, etc. in case of`between`

and a numeric vector in case of`inrange`

.- lower
Lower range bound. Either length 1 or same length as

`x`

.- upper
Upper range bound. Either length 1 or same length as

`x`

.- y
A length-2

`vector`

or`list`

, with`y[[1]]`

interpreted as`lower`

and`y[[2]]`

as`upper`

.- incbounds
`TRUE`

means inclusive bounds, i.e., [lower,upper].`FALSE`

means exclusive bounds, i.e., (lower,upper). It is set to`TRUE`

by default for infix notations.- NAbounds
If

`lower`

(`upper`

) contains an`NA`

what should`lower<=x`

(`x<=upper`

) return? By default`TRUE`

so that a missing bound is interpreted as unlimited.- check
Produce error if

`any(lower>upper)`

?`FALSE`

by default for efficiency, in particular type`character`

.

##### Details

*non-equi* joins were implemented in `v1.9.8`

. They extend
binary search based joins in `data.table`

to other binary operators
including `>=, <=, >, <`

. `inrange`

makes use of this new
functionality and performs a range join.

##### Value

Logical vector the same length as `x`

with value `TRUE`

for those
that lie within the specified range.

##### Note

Current implementation does not make use of ordered keys for
`%between%`

.

##### See Also

##### Examples

```
# NOT RUN {
X = data.table(a=1:5, b=6:10, c=c(5:1))
X[b %between% c(7,9)]
X[between(b, 7, 9)] # same as above
# NEW feature in v1.9.8, vectorised between
X[c %between% list(a,b)]
X[between(c, a, b)] # same as above
X[between(c, a, b, incbounds=FALSE)] # open interval
# inrange()
Y = data.table(a=c(8,3,10,7,-10), val=runif(5))
range = data.table(start = 1:5, end = 6:10)
Y[a %inrange% range]
Y[inrange(a, range$start, range$end)] # same as above
Y[inrange(a, range$start, range$end, incbounds=FALSE)] # open interval
# }
```

*Documentation reproduced from package data.table, version 1.13.0, License: MPL-2.0 | file LICENSE*