358 votes

À l'opposé de %in% : exclure les lignes avec des valeurs spécifiées dans un vecteur

Une variable catégorielle V1 dans un bloc de données D1 peut avoir des valeurs représentées par les lettres de A à Z. Je veux créer un sous-ensemble D2, qui exclut certaines valeurs, disons B, N et T. Fondamentalement, je veux une commande qui est le contraire de %in%

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

468voto

Sacha Epskamp Points 14956

Vous pouvez utiliser l' ! pour rendre tout VRAI FAUX et tout FAUX VRAI. donc:

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

ÉDITER: Vous pouvez également créer vous-même un opérateur :

 '%!in%' <- function(x,y)!('%in%'(x,y))

c(1,3,11)%!in%1:10
[1] FALSE FALSE  TRUE

100voto

Spencer Castro Points 611

Que diriez-vous:

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

52voto

user29609 Points 603

Voici une version utilisant filter en dplyr qui applique la même technique que la réponse acceptée en niant la logique avec ! :

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

35voto

Marek Points 18000

Si vous regardez le code de %in%

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

alors vous devriez être capable d'écrire votre version du contraire. j'utilise

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

Une autre façon est :

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

17voto

EllaK Points 139

L'utilisation de negate partir de purrr également l'affaire rapidement et proprement :

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

Ensuite, l'utilisation est, par exemple,

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X