is.overlapping.Rd
is.overlapping
tests whether a data.table contains intervals which partially or completely overlap
with other intervals in different rows, possibly within groups. is.overlappingv
tests whether
intervals defined by a pair of vectors contains intervals which partially or completely overlap.
is.overlapping(x, interval_vars, group_vars = NULL, verbose = FALSE)
A data.table with two columns defining closed intervals (see also interval_vars).
A length-2 character vector corresponding to column names of x which designate the closed (inclusive) starting and ending intervals. The column name specifying the lower-bound column must be specified first. these columns be of the same class and either be integer or IDate.
NULL or a character vector corresponding to column names of x. overlap checks will occur within groups defined by the columns specified here.
prints additional information, default is FALSE
length-1 logical vector. TRUE if there are any overlaps, FALSE otherwise. (note that a single pair of overlapping intervals within a single group specified by group_vars will result in TRUE)
These functions provide a fast check to see if any intervals in a set overlap.
To actually identify specific segments of overlap,
the data.table::foverlap
can be use to return self-join for partial and/or exactly overlapping
intervals.
intervalaverage::isolateoverlaps
can be used to break partially overlapping intervals
into separate intervals of exact overlap and non-overlap.
Note that it's also possible to use data.table::foverlap
directly to test the
existence of overlaps in a set of intervals
(in fact, that's a what is.overlapping
did in version 0.8.0 and before).
However, this performs a join and if there are many overlaps then foverlaps
will join them all--this is unnecessarily slow and memory intensive if the goal
is to just test for the existence of one or more overlap.
x <- data.table(start=c(1L,2L),end=c(3L,4L))
is.overlapping(x,c("start","end")) #the interval 1,3 overlaps with the interval 2,4
#> [1] TRUE
y <- data.table(start=c(1L,3L),end=c(2L,4L))
is.overlapping(y,c("start","end")) #the interval 1,2 doesn't overlap other intervals in y
#> [1] FALSE
z <- data.table(start=c(1L,3L,1L,2L),end=c(2L,4L,3L,4L),id=c(1,1,2,2))
is.overlapping(z,c("start","end"),"id")
#> [1] TRUE
#note the above returns TRUE because there is an overlap in the group defined by z$id==2
#to identify which group(s) are overlapping: