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?
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?
Odpowiedzi:
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 .
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
x[is.na(match(x,y))]
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
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 y
lub 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
setdiff(x,y)
isetdiff(y,x)
nie są tym samym.