Jak sprawdzić, co jest w jednym wektorze, a co nie?

86

W Matlabie istnieje sposób na znalezienie wartości w jednym wektorze, ale nie w drugim.

na przykład:

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

czy jest jakaś funkcja, która powiedziałaby mi, że wartość w xktórej nie yma to 1?

Tony Stark
źródło

Odpowiedzi:

122

możesz użyć funkcji setdiff () (ustaw różnicę):

> setdiff(x, y)
[1] 1
Xela
źródło
37
Uważaj: setdiff(x,y)i setdiff(y,x)nie są tym samym.
Xi'an
59

Tak. W przypadku wektorów możesz po prostu użyć %in%operatora lub is.element()funkcji.

> x[!(x %in% y)]
1

W przypadku macierzy istnieje wiele podejść do różnic. merge()jest prawdopodobnie najprostszy. Proponuję przyjrzeć się temu pytaniu dla tego scenariusza .

Shane
źródło
28

Plik pomocy w języku R dotyczący setdiff, union, intersect, setequal i is.element zawiera informacje o standardowych funkcjach zestawów w R.

setdiff(x, y)zwraca elementy x, których nie ma w y.

Jak wspomniano powyżej, jest to różnica asymetryczna. Na przykład:

> 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
Jeromy Anglim
źródło
12
x[is.na(match(x,y))]
George Dontas
źródło
5

setdiff()jest skomplikowaną funkcją, ponieważ dane wyjściowe zależą od kolejności danych wejściowych. Zamiast tego możesz napisać prostą funkcję jako taką, która będzie dokładnie odwrotna do intersect. To jest o wiele lepsze.

>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
Koń roboczy
źródło
2

Jeśli:

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

Dowolne z tych wyrażeń:

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

udzieli prawidłowej odpowiedzi [1] 1, jeśli celem jest znalezienie wartości / znaków w x, których nie ma y.

Jednak zastosowanie powyższych wyrażeń może być trudne i może dać niepożądane wyniki w zależności od natury wektora oraz pozycji x i y w wyrażeniu. Na przykład, jeśli:

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

a celem jest po prostu znalezienie unikalnych wartości / znaków x, których nie ma ylub odwrotnie. Zastosowanie któregokolwiek z tych wyrażeń nadal da właściwą odpowiedź [1] 1:

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

Dzięki wkładowi Jeromy Anglim

LUB:

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

Dzięki wkładowi Workhouse

William
źródło