2012-07-03 13 views
9

To jest naprawdę proste, ale nie mogę go zlokalizować. Wiem, że R ma zanegowaną wersję %in%, która zwraca "nie w". Oczywiście mogłem po prostu użyć !(x %in% y), ale język zawiera już zanegowaną konstrukcję i chcę jej użyć, goshdarnit.Mecz z negacją

Więc jaka jest funkcja? Wyszukiwania, a także %nin% i %notin% wszystko zawiedzie.

Bonus internets do ciebie, jeśli wzorzec odpowiedź kontra !(x %in% y) stosując następujące dane przykładowe:

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

Nie sądzę, że tak. Po prostu robię własne używając 'Negate'. – joran

+0

Co nasuwa pytanie: czy 'Negacja' jest szybsza/wolniejsza niż'! '? Ale poważnie, mógłbym przysiąc, że widziałem to już wcześniej. –

+0

Myślę, że pakiet dodatek ma to, co masz po, ale nie jest zbyt szorstki na palec wskazujący, aby wpisać '!'. Zwłaszcza, że ​​twoje nawiasy są niepotrzebne. '! x% w% y' działa dobrze. Zgaduję, że Negate będzie wolniejszy, ponieważ często są to funkcje o wyższym poziomie. –

Odpowiedz

13

prostu z odsetek. Definiowanie:

"%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 

Czy otrzymuję plik cookie?

+2

Otrzymujesz plik cookie dla "testu porównawczego (y [y% ni% x], y% w/o% x)". Czy możesz edytować? –

+0

Więc to jest w zasadzie pranie - 0.3% różnicy to błąd pomiaru. Ale miła praca. –

+1

Ale może zgubić plik cookie z powodu '/' w nazwie funkcji? :-) –