2016-07-13 23 views
7

Esiste una breve negazione di %in% in R come !%in% o %!in%?Negazione% in% in R


Certo che posso negare c("A", "B") %in% c("B", "C") da !(c("A", "B") %in% c("B", "C")) (cfr this question) ma vorrei prefere un approccio più semplice e salvare una coppia di staffe (simili presumibilmente la maggior parte delle persone preferisce c("A", "B") != c("B", "C") sopra !(c("A", "B") == c("B", "C"))).

+0

@SpencerCastro ho incluso un link alla domanda lei ha citato. La mia domanda è diversa: sono consapevole delle possibilità tecniche su come annullare% in%. La mia domanda è se ci sia un approccio in avanti o meno. E la risposta data dall'utente "fallimento catastrofico" che diceva "No, [...] ma ..." era ciò che volevo sapere. – Qaswed

+0

Ottimo, penso che collegare queste domande sia utile, perché entrambe forniscono una spiegazione completa delle soluzioni. –

risposta

14

No, non c'è un costruito in funzione di farlo, ma si potrebbe facilmente codificare da soli con

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

O

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

Vedere questa discussione e follow discussione: %in% operator - NOT IN


Inoltre, è stato sottolineato il pacchetto Hmisc include l'operatore %nin%, quindi se si' riutilizzandolo per le tue applicazioni è già lì.

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

Curioso il motivo per cui questa funzione esiste, dato che tutto ciò che fa è letteralmente gettare un '!' Di fronte al suo argomento – MichaelChirico

4

In realtà non è necessaria la parentesi aggiuntiva, !c("A", "B") %in% c("B", "C") funziona.

Se preferite qualcosa che legge più semplice di definire da soli:

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

Questo ha il vantaggio di non sprecare sforzo - non otteniamo un risultato e poi negarlo, abbiamo solo ottenere il risultato direttamente. (La differenza dovrebbe essere generalmente banali)

6

Si può sempre creare uno:

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

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

In caso contrario v'è una funzione in qualche modo simile con setdiff, che restituisce i uniche elementi di a che non sono in b:

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

Tu (o meglio, l'OP) dovresti stare attento a usare 'setdiff' invece di un'% in% 'negato poiché, come indica il nome, è un'operazione _set_ e quindi restituisce solo _unique_ elementi di' a' che sono non in 'b'. Questo potrebbe essere un risultato molto diverso da un '% in%' negato. –

+0

Vero, modifico per rendere quel punto più chiaro. Grazie! – plannapus