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 x
której nie y
ma to 1?
możesz użyć funkcji setdiff () (ustaw różnicę):
> setdiff(x, y)
[1] 1
setdiff(x,y)
isetdiff(y,x)
nie są tym samym.Tak. W przypadku wektorów możesz po prostu użyć
%in%
operatora lubis.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 .źródło
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 elementyx
, których nie ma wy
.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
źródło
źródło
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 dointersect
. 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
źródło
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 wx
, których nie may
.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 may
lub odwrotnie. Zastosowanie któregokolwiek z tych wyrażeń nadal da właściwą odpowiedź[1] 1
: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
źródło