Як визначити, що є в одному векторі, а не в іншому?


86

У Matlab є спосіб знайти значення в одному векторі, але не в іншому.

наприклад:

x <- c(1,2,3,4)
y <- c(2,3,4)

чи є якась функція, яка могла б сказати мені, що значення, xяке не в, yдорівнює 1?

Відповіді:


122

Ви можете скористатися функцією setdiff () (встановити різницю):

> setdiff(x, y)
[1] 1

37
Варто: setdiff(x,y)і setdiff(y,x)не те саме.
Сіань


28

Файл довідки в R для setdiff, union, intersect, setequal та is.element надає інформацію про стандартні функції набору в R.

setdiff(x, y)повертає елементи x, яких немає в y.

Як зазначалося вище, це асиметрична різниця. Так наприклад:

> x <- c(1,2,3,4)
> y <- c(2,3,4,5)
> 
> setdiff(x, y)
[1] 1
> setdiff(y, x)
[1] 5
> union(setdiff(x, y), setdiff(y, x))
[1] 1 5


5

setdiff()є хитрою функцією, оскільки вихідний результат залежить від порядку введення. Натомість ви можете написати просту функцію як таку, яка виконує прямо протилежне intersect. Це набагато краще.

>difference <- function(x, y) {
c(setdiff(x, y), setdiff(y, x))
}

#Now lets test it. 
>x <- c(1,2,3,4)
>y <- c(2,3,4,5)

>difference(x,y)
[1] 1 5

2

Якщо:

x <- c(1,2,3,4)
y <- c(2,3,4)

Будь-який з цих виразів:

setdiff(x, y)
x[!(x %in% y)]
x[is.na(match(x,y))]
x[!(is.element(x,y))]

дасть вам правильну відповідь [1] 1, якщо метою є пошук значень / символів у x, яких немає в y.

Однак застосування вищезазначених виразів може бути складним і може дати небажані результати залежно від природи вектора та положення x та y у виразі. Наприклад, якщо:

x <- c(1,1,2,2,3,4)
y <- c(2,3,4)

і мета полягає просто в тому, щоб знайти унікальні значення / символи в x, яких немає yабо навпаки. Застосування будь-якого з цих виразів все одно дасть правильну відповідь [1] 1:

union(setdiff(x, y), setdiff(y, x))

Завдяки внеску Джеромі Англіма

АБО:

difference <- function(x, y) {
c(setdiff(x, y), setdiff(y, x))
}
difference(y,x)

Завдяки внеску Workhouse

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.