2013-04-05 13 views
5

Jeśli masz wektor ciągów znaków i chcesz wiedzieć, który z nich pasuje. Jest to prosta sprawa użycia% w%.Wyszukiwanie ciągów nie% w% innych wektorach ciągów znaków

x <- c("red","blue","green") 
y <- c("yellow","blue","orange") 

which(x %in% y) # Literally, which X are in Y. 

Ale co z drugiej strony, gdzie chciałbyś się dowiedzieć, które X nie są w Y?

+1

Spróbuj 'które (x% w% r!)'. –

+1

Roman dodaj to jako rozwiązanie –

+0

@ RomanLuštrik Użyłem 'which (is.na (match (x, y))' po prostu wydawało się zbyt brzydkie –

Odpowiedz

8

zgrabny sposób, że lubię (to dowiedziałem się od @joran, IIRC) wynosi:

`%nin%` <- Negate(`%in%`) 
which(x %nin% y) 
[1] 1 3  
+2

'% nin%' jest również dostarczane przez pakiet 'Hmisc', między innymi. – krlmlr

+0

+1 To jest fajne –

+1

+1 do Arun za przekroczenie mil/kilometr. –

5

Wykonanie %in% zwraca wektor wartości i false. Używanie wykrzyknika spowoduje zmianę tych wartości Ts i Fs, a zawijanie wszystkiego w which da ci indeksy.

> which(!x %in% y) 
[1] 1 3 
> which(x %in% y) 
[1] 2 
+1

Również, jeśli zamierzasz zrobić 'x [który (! X% w% y)] ', wtedy możesz preferować' setdiff (x, y) '. Ten ostatni stosuje także "unikalny". – flodel

+2

Mogę być paranoikiem, ale pokornie zasugerowałem 'który (! (X% w% y)), aby poprawić czytelność. –

+0

@ Ferdinand.kraft Zgadzam się z tobą i podoba mi się również nawias. Jest to jeszcze jeden powód, dla którego poniższa sugestia "% ni%" jest tak dobra! –

Powiązane problemy