2016-07-13 51 views
7

Czy istnieje krótka negacja %in% w R jak !%in% lub %!in%?Negacja% w% w R


Oczywiście mogę negować c("A", "B") %in% c("B", "C") przez !(c("A", "B") %in% c("B", "C")) (por this question) ale chciałbym preferują bardziej prostego podejścia do przodu i zaoszczędzić parę wsporników (podobnie przypuszczalnie większość ludzi wolałaby c("A", "B") != c("B", "C") nad !(c("A", "B") == c("B", "C"))).

+0

@SpencerCastro I zawierał link do kwestii pan wspomniał. Moje pytanie jest inne: mam świadomość technicznych możliwości negowania% w%. Moje pytanie dotyczy tego, czy podejście oparte jest na ciele, czy też nie. A odpowiedź udzielona przez użytkownika "katastroficzna awaria", mówiąc "Nie, [...] ale ..." była tym, co chciałem wiedzieć. – Qaswed

+0

Świetnie, myślę, że połączenie tych pytań jest pomocne, ponieważ oba zapewniają pełne wyjaśnienie rozwiązań. –

Odpowiedz

14

nie, nie ma wbudowaną funkcję, aby to zrobić, ale można łatwo się z nim kodu

`%nin%` = Negate(`%in%`) 

Albo

`%!in%` = Negate(`%in%`) 

Zobacz wątek i nawiązanie dyskusji: %in% operator - NOT IN


Ponadto wskazywano, pakiet Hmisc obejmuje operatora %nin%, więc jeśli” ponownie używać go do swoich aplikacji, które już tam jest.

library(Hmisc) 
"A" %nin% "B" 
#[1] TRUE 
"A" %nin% "A" 
#FALSE 
+0

Ciekawe, dlaczego ta funkcja istnieje, biorąc pod uwagę, że wszystko to dosłownie rzuca "!" Przed swoją argumentacją – MichaelChirico

4

Właściwie nie potrzebujesz dodatkowych nawiasów, !c("A", "B") %in% c("B", "C") działa.

Jeśli wolisz coś, co brzmi łatwiej, wystarczy zdefiniować to sam:

"%nin%" <- function(x, table) match(x, table, nomatch = 0L) == 0L 

Ma to tę zaletę, że nie marnować wysiłku - nie mamy uzyskać wynik, a następnie neguje go, po prostu dostać wynik bezpośrednio. (Różnica powinna być ogólnie trywialne)

6

Zawsze można utworzyć:

> `%out%` <- function(a,b) ! a %in% b 

> 1:10 %out% 5:15 
[1] TRUE TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE 

przeciwnym razie istnieje nieco podobną funkcję z setdiff, który zwraca unikalne elementy a, które nie są w b:

> setdiff(1:10,5:15) 
[1] 1 2 3 4 
> setdiff(5:15,1:10) 
[1] 11 12 13 14 15 
+3

Ty (a raczej OP) powinieneś zachować ostrożność używając 'setdiff' zamiast zanegowanego'% w% ', ponieważ, jak wskazuje nazwa, jest to operacja _set, a więc zwraca tylko _unikalne_ elementy' a' które są nie w "b". Może to być zupełnie inny wynik niż zanegowany '% w%'. –

+0

To prawda, będę edytować, aby ten punkt był jaśniejszy. Dzięki! – plannapus