2012-07-03 13 views
9

Das ist wirklich einfach, aber ich kann es nicht zu finden scheinen. Ich weiß, dass R eine negierte Version von %in% hat, die "nicht in" zurückgibt. Natürlich könnte ich einfach !(x %in% y) verwenden, aber die Sprache enthält ein bereits negiertes Konstrukt und ich möchte es verwenden, goshdarnit.Spiel mit Negation

Was ist also die Funktion? Suchvorgänge sowie %nin% und %notin% scheitern alle.

Bonus internets zu Ihnen, wenn Sie vergleichen Sie Ihre Antwort im Vergleich zu !(x %in% y) den folgenden Beispieldaten:

x <- sample(sample(letters,5), 10^3, replace=TRUE) 
y <- sample(letters, 10^5, replace=TRUE) 
+1

Ich glaube nicht, es tut. Ich mache mich selbst mit 'Negate'. – joran

+0

Was die Frage aufwirft: Ist 'Negate' schneller/langsamer als'! '? Aber im Ernst, ich könnte schwören, dass ich es schon mal gesehen habe. –

+0

Ich denke, ein Add-on-Paket hat, was Sie wollen, aber es ist nicht zu rau auf den Zeigefinger zu tippen '!'. Zumal Ihre Klammern unnötig sind. '! x% in% y' funktioniert gut. Ich vermute, dass Negate langsamer sein wird, da oft Funktionen höherer Ordnung sind. –

Antwort

13

Nur aus Interesse. Definition

"%w/o%" <- function(x, y) x[!x %in% y] 
'%ni%' <- Negate('%in%') 

> benchmark(y[y%ni%x], y%w/o%x,replications=1000) 
     test replications elapsed relative user.self sys.self user.child 
2 y %w/o% x   1000 5.32 1.000000  4.60  0.70   NA 
1 y[y %ni% x]   1000 5.34 1.003759  4.68  0.65   NA 
    sys.child 
2  NA 
1  NA 

Erhalte ich einen Cookie?

+2

Sie erhalten ein Cookie für 'benchmark (y [y% ni% x], y% w/o% x)'. Kannst du bearbeiten? –

+0

Also das ist im Grunde eine Wäsche - 0,3% Unterschied ist Messfehler. Aber nette Arbeit. –

+1

Aber vielleicht verlieren Sie einen Cookie für ein '/' in einem Funktionsnamen? :-) –