R Language
Установить операции
Поиск…
замечания
Набор содержит только одну копию каждого отдельного элемента. В отличие от некоторых других языков программирования, база R не имеет специального типа данных для наборов. Вместо этого R обрабатывает вектор, подобный множеству, беря только его отдельные элементы. Это относится к операторам множества, setdiff
, intersect
, union
, setequal
и %in%
. При v %in% S
только S
рассматривается как множество, а не вектор v
.
Для истинно заданного типа данных в R пакет Rcpp предоставляет некоторые параметры .
Установить операторы для пар векторов
Сравнение наборов
В R вектор может содержать дублированные элементы:
v = "A"
w = c("A", "A")
Однако набор содержит только одну копию каждого элемента. R обрабатывает вектор, подобный множеству, беря только его отдельные элементы, поэтому два вектора выше считаются одинаковыми:
setequal(v, w)
# TRUE
Комбинированные наборы
Основные функции имеют естественные имена:
x = c(1, 2, 3)
y = c(2, 4)
union(x, y)
# 1 2 3 4
intersect(x, y)
# 2
setdiff(x, y)
# 1 3
Они все документировано на той же странице, ?union
.
Установить членство для векторов
Оператор %in%
сравнивает вектор с множеством.
v = "A"
w = c("A", "A")
w %in% v
# TRUE TRUE
v %in% w
# TRUE
Каждый элемент слева обрабатывается индивидуально и проверяется на принадлежность к набору, связанному с вектором справа (состоящим из всех его отдельных элементов).
В отличие от тестов равенства, %in%
всегда возвращает TRUE
или FALSE
:
c(1, NA) %in% c(1, 2, 3, 4)
# TRUE FALSE
Документация находится в ?`%in%`
.
Декартовы или «кросс» произведения векторов
Чтобы найти каждый вектор вида (x, y), где x выведен из вектора X и y из Y, мы используем expand.grid
:
X = c(1, 1, 2)
Y = c(4, 5)
expand.grid(X, Y)
# Var1 Var2
# 1 1 4
# 2 1 4
# 3 2 4
# 4 1 5
# 5 1 5
# 6 2 5
Результатом является data.frame с одним столбцом для каждого переданного ему вектора. Часто мы хотим взять декартово произведение множеств, а не расширять «сетку» векторов. Мы можем использовать unique
, lapply
и do.call
:
m = do.call(expand.grid, lapply(list(X, Y), unique))
# Var1 Var2
# 1 1 4
# 2 2 4
# 3 1 5
# 4 2 5
Применение функций к комбинациям
Если вы хотите применить функцию к каждой результирующей комбинации f(x,y)
, ее можно добавить в качестве другого столбца:
m$p = with(m, Var1*Var2)
# Var1 Var2 p
# 1 1 4 4
# 2 2 4 8
# 3 1 5 5
# 4 2 5 10
Этот подход работает на столько векторов, сколько нам нужно, но в частном случае из двух иногда лучше иметь результат в матрице, которая может быть достигнута с помощью outer
:
uX = unique(X)
uY = unique(Y)
outer(setNames(uX, uX), setNames(uY, uY), `*`)
# 4 5
# 1 4 5
# 2 8 10
Соответствующие понятия и инструменты см. В теме комбинаторики.
Сделайте уникальные / капли дубликатов / выберите отдельные элементы из вектора
unique
капли дублируют, так что каждый элемент в результате уникален (появляется только один раз):
x = c(2, 1, 1, 2, 1)
unique(x)
# 2 1
Значения возвращаются в том порядке, в котором они впервые появились.
duplicated
теги каждый дублированный элемент:
duplicated(x)
# FALSE FALSE TRUE TRUE TRUE
anyDuplicated(x) > 0L
- это быстрый способ проверить, содержит ли вектор любые дубликаты.
Интервалы измерительных наборов / диаграммы Венна для векторов
Чтобы подсчитать, сколько элементов двух наборов перекрывается, можно написать настраиваемую функцию:
xtab_set <- function(A, B){
both <- union(A, B)
inA <- both %in% A
inB <- both %in% B
return(table(inA, inB))
}
A = 1:20
B = 10:30
xtab_set(A, B)
# inB
# inA FALSE TRUE
# FALSE 0 10
# TRUE 9 11
Диаграмма Венна, предлагаемая различными пакетами, может быть использована для визуализации совпадений между несколькими наборами.