2012-07-03 28 views
9

Esto es realmente simple pero parece que no puedo encontrarlo. Sé que R tiene una versión negada de %in% que devuelve "no entra". Obviamente, podría usar !(x %in% y), pero el lenguaje incluye una construcción ya negada y quiero usarlo, goshdarnit.Coincidir con la negación

¿Cuál es la función? Las búsquedas así como %nin% y %notin% fallaron.

bonificación internets a usted si usted comparar su respuesta frente !(x %in% y) utilizando los datos de ejemplo:

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

No creo que sí. Solo hago mi propio uso de 'Negate'. – joran

+0

Lo que plantea la pregunta: ¿'Negate' es más rápido/lento que'! '? Pero en serio, podría haber jurado que lo he visto antes. –

+0

Creo que un paquete adicional tiene lo que buscas, pero no es demasiado duro en el dedo índice para escribir '!'. Especialmente dado que tus paréntesis son innecesarios. '! x% en% y' funciona bien. Supongo que Negate será más lento ya que a menudo son funciones de orden superior. –

Respuesta

13

Solo por curiosidad. Definición de

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

¿Me sale una galleta?

+2

Obtiene una cookie para 'punto de referencia '(y [y% ni% x], y% w/o% x)'. ¿Puedes editar? –

+0

Así que eso es básicamente un lavado - 0.3% de diferencia es error de medición. Pero buen trabajo. –

+1

¿Pero quizás pierda una cookie por tener un '/' en el nombre de una función? :-) –

Cuestiones relacionadas