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?

Odpowiedzi:


122

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

> setdiff(x, y)
[1] 1

37
Uważaj: setdiff(x,y)i setdiff(y,x)nie są tym samym.
Xi'an


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


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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.