| sets {base} | R Documentation |
Set Operations
Description
Performs set union, intersection, (asymmetric!) difference, equality and membership on two vectors.
Usage
union(x, y)
intersect(x, y)
setdiff(x, y)
setequal(x, y)
is.element(el, set)
Arguments
x, y, el, set |
vectors (of the same mode) containing a sequence of items (conceptually) with no duplicated values. |
Details
The set operations are intended for “same-kind”
“vector-like” objects containing sequences of items. However,
being “vector-like” cannot easily be ascertained (in particular
as is.vector() enforces a very narrow concept of
“vector”).
Thus, for R < 4.5.0, the set operands were always transformed via
as.vector() (so that in particular, factors were coerced
to character vectors). Starting with R 4.5.0, operands of the
“same kind” (in the sense that isa(x, class(y))
or isa(y, class(x)) which appear to be
“vector-like” (in the sense that dim(x) has length at
most one, and subscripting x and/or
y by 0L leaves the class unchanged) are no longer
transformed. In particular, union, intersection and set difference
of two factors now give factors (see the examples).
is.element(x, y) is identical to x %in% y (after
possibly transforming via as.vector()).
Value
For union, a vector of a common mode or class.
For intersect, a vector of a common mode or class, or
NULL if x or y is NULL.
For setdiff, a vector of the same mode or class
as x.
A logical scalar for setequal and a logical of the same
length as x for is.element.
See Also
‘plotmath’ for the use of union and
intersect in plot annotation.
Examples
(x <- c(sort(sample(1:20, 9)), NA))
(y <- c(sort(sample(3:23, 7)), NA))
union(x, y)
intersect(x, y)
setdiff(x, y)
setdiff(y, x)
setequal(x, y)
## True for all possible x & y :
setequal( union(x, y),
c(setdiff(x, y), intersect(x, y), setdiff(y, x)))
is.element(x, y) # length 10
is.element(y, x) # length 8
## Factors:
x <- as.factor(c("A", "B", "A"))
y <- as.factor(c("B", "b"))
union(x, y)
intersect(x, y)
setdiff(x, y)
setdiff(y, x)
## (Note that union() and intersect() merge the levels.)