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%`)