Поиск…


замечания

Набор содержит только одну копию каждого отдельного элемента. В отличие от некоторых других языков программирования, база 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

Диаграмма Венна, предлагаемая различными пакетами, может быть использована для визуализации совпадений между несколькими наборами.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow