UNION ALL или INTERSECT ALL эквивалентно в R? - PullRequest
1 голос
/ 07 мая 2020

R имеет встроенные функции union и correct , которые работают с векторами и интерпретируют их как множества. Это имеет побочный эффект, заключающийся в том, что дублирующиеся записи удаляются:

> x <- c(1,2,3,3,1)
> y <- c(1,1,2)
> union(x,y)
[1] 1 2 3
> intersect(x,y)
[1] 1 2

Есть ли возможность обработать векторы как мультимножества (также известные как сумки ), например в SQL модификатор ALL выполняет?

Результаты должны быть (1,1,1,1,2,2,3,3) для union и (1,1, 2) для пересекаются .

Дополнение (пояснение): Элемент, который встречается n раз в x и m раз в y , должно быть

  • n + m раз в объединении
  • мин ( n , m ) раз на пересечении
  • max ( n - m , 0 ) раз в разнице ( x кроме y )

Ответы [ 3 ]

3 голосов
/ 07 мая 2020

A base решение:

sort(x[x %in% y])
[1] 1 1 2

sort(c(x,y)) 
[1] 1 1 1 1 2 2 3 3

На основе edit :

 x <- c(1,2,3,3,1)
  y <- c(1,1,2)
 c(min(x[x %in% y]),unique(y[y%in%x]))
[1] 1 1 2
 x = c(1,1,1)
y = c(1,1,5)
 c(min(x[x %in% y]),unique(y[y%in%x]))
[1] 1 1
1 голос
/ 07 мая 2020

vecsets::vintersect() делает именно то, что вы хотите для пересечения:

В отличие от функции base :: correct, если векторы имеют общие повторяющиеся элементы, пересечение возвращает столько этих элементов, сколько есть в каком бы векторе их меньше.

vecsets::vintersect(x,y)
# [1] 1 1 2

К сожалению, vecsets::vunion() следует определению, отличному от вашего, которое, как указывали другие, кажется просто конкатенацией: *

1 голос
/ 07 мая 2020

Для вашего примера объединения sort(union_all(x, y)) дает желаемый результат.

Не уверен насчет вашего случая пересечения, я никогда не сталкивался с этой проблемой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...