Evaluating if values of vectors are within different open/closed intervals
(x %[]% c(a, b)
), or if two closed
intervals overlap (c(a1, b1) %[o]% c(a2, b2)
).
Operators for negation and directional relations also implemented.
Values of x
are compared to interval endpoints a
and b
(a <= b
).
Endpoints can be defined as a vector with two values (c(a, b)
):
these values will be compared as a single interval with each value in x
.
If endpoints are stored in a matrix-like object or a list,
comparisons are made element-wise.
x <- rep(4, 5)
a <- 1:5
b <- 3:7
cbind(x=x, a=a, b=b)
x %[]% cbind(a, b) # matrix
x %[]% data.frame(a=a, b=b) # data.frame
x %[]% list(a, b) # list
If lengths do not match, shorter objects are recycled. Return values are logicals.
Note: interval endpoints are sorted internally thus ensuring the condition
a <= b
is not necessary.
These value-to-interval operators work for numeric (integer, real) and ordered vectors, and object types which are measured at least on ordinal scale (e.g. dates).
The following special operators are used to indicate closed ([
, ]
) or open ((
, )
) interval endpoints:
Operator | Expression | Condition |
---|---|---|
%[]% |
x %[]% c(a, b) |
x >= a & x <= b |
%[)% |
x %[)% c(a, b) |
x >= a & x < b |
%(]% |
x %(]% c(a, b) |
x > a & x <= b |
%()% |
x %()% c(a, b) |
x > a & x < b |
Equal | Not equal | Less than | Greater than |
---|---|---|---|
%[]% |
%)(% |
%[<]% |
%[>]% |
%[)% |
%)[% |
%[<)% |
%[>)% |
%(]% |
%](% |
%(<]% |
%(>]% |
%()% |
%][% |
%(<)% |
%(>)% |
The overlap of two closed intervals, [a1
, b1
] and [a2
, b2
],
is evaluated by the %[o]%
operator (a1 <= b1
, a2 <= b2
).
Endpoints can be defined as a vector with two values
(c(a1, b1)
)or can be stored in matrix-like objects or a lists
in which case comparisons are made element-wise.
Note: interval endpoints
are sorted internally thus ensuring the conditions
a1 <= b1
and a2 <= b2
is not necessary.
c(2, 3) %[o]% c(0, 1)
list(0:4, 1:5) %[o]% c(2, 3)
cbind(0:4, 1:5) %[o]% c(2, 3)
data.frame(a=0:4, b=1:5) %[o]% c(2, 3)
If lengths do not match, shorter objects are recycled. These value-to-interval operators work for numeric (integer, real) and ordered vectors, and object types which are measured at least on ordinal scale (e.g. dates).
%)o(%
is used for the negation,
directional evaluation is done via the operators %[<o]%
and %[o>]%
.
Equal | Not equal | Less than | Greater than |
---|---|---|---|
%[o]% |
%)o(% |
%[<o]% |
%[o>]% |
The previous operators will return NA
for unordered factors.
Set overlap can be evaluated by the base %in%
operator and its negation
%ni%
.
Install from CRAN:
install.packages("intrval")
Install development version from GitHub:
devtools::install_github("psolymos/intrval")
User visible changes are listed in the NEWS file.
Use the issue tracker to report a problem.
## bounding box
set.seed(1)
n <- 10^4
x <- runif(n, -2, 2)
y <- runif(n, -2, 2)
d <- sqrt(x^2 + y^2)
iv1 <- x %[]% c(-0.25, 0.25) & y %[]% c(-1.5, 1.5)
iv2 <- x %[]% c(-1.5, 1.5) & y %[]% c(-0.25, 0.25)
iv3 <- d %()% c(1, 1.5)
plot(x, y, pch = 19, cex = 0.25, col = iv1 + iv2 + 1,
main = "Intersecting bounding boxes")
plot(x, y, pch = 19, cex = 0.25, col = iv3 + 1,
main = "Deck the halls:\ndistance range from center")
## time series filtering
x <- seq(0, 4*24*60*60, 60*60)
dt <- as.POSIXct(x, origin="2000-01-01 00:00:00")
f <- as.POSIXlt(dt)$hour %[]% c(0, 11)
plot(sin(x) ~ dt, type="l", col="grey",
main = "Filtering date/time objects")
points(sin(x) ~ dt, pch = 19, col = f + 1)
## QCC
library(qcc)
data(pistonrings)
mu <- mean(pistonrings$diameter[pistonrings$trial])
SD <- sd(pistonrings$diameter[pistonrings$trial])
x <- pistonrings$diameter[!pistonrings$trial]
iv <- mu + 3 * c(-SD, SD)
plot(x, pch = 19, col = x %)(% iv +1, type = "b", ylim = mu + 5 * c(-SD, SD),
main = "Shewhart quality control chart\ndiameter of piston rings")
abline(h = mu)
abline(h = iv, lty = 2)
## Annette Dobson (1990) "An Introduction to Generalized Linear Models".
## Page 9: Plant Weight Data.
ctl <- c(4.17,5.58,5.18,6.11,4.50,4.61,5.17,4.53,5.33,5.14)
trt <- c(4.81,4.17,4.41,3.59,5.87,3.83,6.03,4.89,4.32,4.69)
group <- gl(2, 10, 20, labels = c("Ctl","Trt"))
weight <- c(ctl, trt)
lm.D9 <- lm(weight ~ group)
## compare 95% confidence intervals with 0
(CI.D9 <- confint(lm.D9))
# 2.5 % 97.5 %
# (Intercept) 4.56934 5.4946602
# groupTrt -1.02530 0.2833003
0 %[]% CI.D9
# (Intercept) groupTrt
# FALSE TRUE
lm.D90 <- lm(weight ~ group - 1) # omitting intercept
## compare 95% confidence of the 2 groups to each other
(CI.D90 <- confint(lm.D90))
# 2.5 % 97.5 %
# groupCtl 4.56934 5.49466
# groupTrt 4.19834 5.12366
CI.D90[1,] %[o]% CI.D90[2,]
# 2.5 %
# TRUE
DATE <- as.Date(c("2000-01-01","2000-02-01", "2000-03-31"))
DATE %[<]% as.Date(c("2000-01-15", "2000-03-15"))
# [1] TRUE FALSE FALSE
DATE %[]% as.Date(c("2000-01-15", "2000-03-15"))
# [1] FALSE TRUE FALSE
DATE %[>]% as.Date(c("2000-01-15", "2000-03-15"))
# [1] FALSE FALSE TRUE