2016-07-13 16 views
7

Gibt es eine kurze Negation von %in% in R wie !%in% oder %!in%?Negation von% in% in R


Natürlich kann ich c("A", "B") %in% c("B", "C") von !(c("A", "B") %in% c("B", "C")) (vgl this question) negieren, aber ich würde einen eher geradlinigen Ansatz prefere und ein Paar von Klammern speichern (ähnlich vermutlich die meisten Menschen c("A", "B") != c("B", "C") über !(c("A", "B") == c("B", "C")) bevorzugen würde).

+0

@SpencerCastro ich einen Link auf die Frage enthalten, die Sie erwähnt. Meine Frage ist anders: Ich kenne die technischen Möglichkeiten, wie% in% zu negieren ist. Meine Frage ist, ob es eine direkte Annäherung gibt oder nicht. Und die Antwort des Benutzers "katastrophales Versagen", die "Nein, [...] aber ..." sagt, war was ich wissen wollte. – Qaswed

+0

Gut, ich denke, diese Fragen zu verknüpfen ist hilfreich, weil beide eine vollständige Erklärung der Lösungen bieten. –

Antwort

14

Nein, ist es nicht eine eingebaute Funktion, das zu tun, aber man konnte es leicht, sich Code mit

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

Oder

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

Siehe diesen Thread und Followup Diskussion: %in% operator - NOT IN


Auch wurde das Paket Hmisc enthält wies auf die Betreiber %nin%, wenn Sie also‘ Um es für Ihre Anwendungen zu verwenden, ist es schon da.

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

Neugierig, warum diese Funktion existiert, wenn sie alles tut, wirft sie buchstäblich ein '!' Vor ihr Argument – MichaelChirico

4

Eigentlich brauchen Sie nicht die zusätzlichen Klammern, !c("A", "B") %in% c("B", "C") funktioniert.

Wenn Sie lieber etwas, das leichter liest, definieren sie nur sich selbst:

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

dies den Vorteil, nicht verschwenden Aufwand hat - wir kein Ergebnis erhalten und negieren es dann, wir bekommen nur die Ergebnis direkt. (Die Differenz sollte in der Regel trivial sein)

6

Sie immer einen erstellen:

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

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

Ansonsten gibt es eine etwas ähnliche Funktion mit setdiff, die die einzigartigen Elemente a zurückgibt, die nicht in b ist:

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

Sie (oder besser gesagt, das OP) sollten vorsichtig sein mit 'setdiff' statt einem negierten'% in% 'da, wie der Name andeutet, es eine _set_ Operation ist und daher nur _unique_ Elemente von' a' zurückgibt nicht in "b". Dies kann ein sehr unterschiedliches Ergebnis von einem negierten% in% sein. –

+0

Wahr, ich werde bearbeiten, um diesen Punkt klarer zu machen. Vielen Dank! – plannapus