Opuesto de% en%

Una variable categórica V1 en una ttwig de datos D1 puede tener valores representados por las letras de la A a la Z. Quiero crear un subconjunto D2, que excluye algunos valores, por ejemplo, B, N y T. Básicamente, quiero un comando que sea el opuesto de %in%

 D2 = subset(D1, V1 %in% c('B','N',T')) 

Puedes usar el ! operador para básicamente hacer VERDADERO FALSO y todo FALSO VERDADERO. asi que:

 D2 = subset(D1, !(V1 %in% c('B','N',T'))) 

EDITAR: también puede crear un operador usted mismo:

 '%!in%' <- function(x,y)!('%in%'(x,y)) c(1,3,11)%!in%1:10 [1] FALSE FALSE TRUE 

Si miras el código de %in%

  function (x, table) match(x, table, nomatch = 0L) > 0L 

entonces deberías poder escribir tu versión de opuesto. yo suelo

 `%not in%` <- function (x, table) is.na(match(x, table, nomatch=NA_integer_)) 

Otra forma es:

 function (x, table) match(x, table, nomatch = 0L) == 0L 

Qué tal si:

 '%ni%' <- Negate('%in%') c(1,3,11) %ni% 1:10 # [1] FALSE FALSE TRUE 

Aquí hay una versión que utiliza el filter en dplyr que aplica la misma técnica que la respuesta aceptada al negar la lógica con!

 D2 <- D1 %>% dplyr::filter(!V1 %in% c('B','N','T')) 

El uso de purrr from purrr también hace el truco de forma rápida y clara:

 `%not_in%` <- purrr::negate(`%in%`) 

Entonces el uso es, por ejemplo,

 c("cat", "dog") %not_in% c("dog", "mouse") 

Otra solución podría ser el uso de setdiff

 D1 = c("A",..., "Z") ; D0 = c("B","N","T") D2 = setdiff(D1, D0) 

D2 es tu subconjunto deseado.

purrr::compose() es otra forma rápida de definir esto para su uso posterior, como en:

 `%!in%` <- compose(`!`, `%in%`)