This family of functions performs pairwise set operations on two ivs.
Pairwise refers to the fact that the i-th interval of x
is going to be
compared against the i-th interval of y
. This is in contrast to their
counterparts, like iv_set_union()
, which treat the entire vector of x
as a single set to be compared against all of y
.
The descriptions of these operations are the same as their non-pairwise counterparts, but the ones here also have a number of restrictions due to the fact that each must return an output that is the same size as its inputs:
For
iv_pairwise_set_complement()
,x[i]
andy[i]
can't overlap or abut, as this would generate an empty complement.For
iv_pairwise_set_union()
,x[i]
andy[i]
can't be separated by a gap. Useiv_pairwise_span()
if you want to force gaps to be filled anyways.For
iv_pairwise_set_intersect()
,x[i]
andy[i]
must overlap, otherwise an empty interval would be generated.For
iv_pairwise_set_difference()
,x[i]
can't be completely contained withiny[i]
, as that would generate an empty interval. Additionally,y[i]
can't be completely contained withinx[i]
, as that would result in two distinct intervals for a single observation.For
iv_pairwise_set_symmetric_difference()
,x[i]
andy[i]
must share exactly one endpoint, otherwise an empty interval or two distinct intervals would be generated.
Usage
iv_pairwise_set_complement(x, y)
iv_pairwise_set_union(x, y)
iv_pairwise_set_intersect(x, y)
iv_pairwise_set_difference(x, y)
iv_pairwise_set_symmetric_difference(x, y)
Arguments
- x, y
[iv]
A pair of interval vectors.
These will be cast to the same type, and recycled against each other.
See also
The non-pairwise versions of these functions, such as
iv_set_union()
.
Examples
x <- iv_pairs(c(1, 3), c(6, 8))
y <- iv_pairs(c(5, 7), c(2, 3))
iv_pairwise_set_complement(x, y)
#> <iv<double>[2]>
#> [1] [3, 5) [3, 6)
z <- iv_pairs(c(2, 5), c(4, 7))
iv_pairwise_set_union(x, z)
#> <iv<double>[2]>
#> [1] [1, 5) [4, 8)
# Can't take the union when there are gaps
try(iv_pairwise_set_union(x, y))
#> Error in iv_pairwise_set_union(x, y) :
#> Can't take the union of intervals containing a gap.
#> ℹ Location 1 contains a gap.
#> ℹ Use `iv_pairwise_span()` to combine across gaps.
# But you can force a union across gaps with `iv_pairwise_span()`
iv_pairwise_span(x, y)
#> <iv<double>[2]>
#> [1] [1, 7) [2, 8)
iv_pairwise_set_intersect(x, z)
#> <iv<double>[2]>
#> [1] [2, 3) [6, 7)
# Can't take an intersection of non-overlapping intervals
try(iv_pairwise_set_intersect(x, y))
#> Error in iv_pairwise_set_intersect(x, y) :
#> Can't take the intersection of non-overlapping intervals.
#> ℹ This would result in an empty interval.
#> ℹ Location 1 contains non-overlapping intervals.
iv_pairwise_set_difference(x, z)
#> <iv<double>[2]>
#> [1] [1, 2) [7, 8)
# The pairwise symmetric difference function is fairly strict,
# and is only well defined when exactly one of the interval endpoints match
w <- iv_pairs(c(1, 6), c(7, 8))
iv_pairwise_set_symmetric_difference(x, w)
#> <iv<double>[2]>
#> [1] [3, 6) [6, 7)