Comment supprimer plusieurs valeurs d’un vecteur?

J’ai un vecteur comme: a = c(1:10) et j’ai besoin de supprimer plusieurs valeurs, comme: 2, 3, 5

Comment supprimer ces nombres (ils ne sont PAS les positions dans le vecteur) dans le vecteur?

au moment où je boucle le vecteur et fais quelque chose comme:

 a[!a=NUMBER_TO_REMOVE] 

Mais je pense qu’il y a une fonction qui le fait automatiquement.

L’opérateur %in% vous indique quels éléments sont parmi les numéros à supprimer:

 > a <- sample (1 : 10) > remove <- c (2, 3, 5) > a [1] 10 5 2 7 1 6 3 4 8 9 > a %in% remove [1] FALSE TRUE TRUE FALSE FALSE FALSE TRUE FALSE FALSE FALSE > a [! a %in% remove] [1] 10 7 1 6 4 8 9 

Vous pouvez utiliser setdiff .

Donné

 a <- sample(1:10) remove <- c(2, 3, 5) 

alors

 > a [1] 10 8 9 1 3 4 6 7 2 5 > setdiff(a, remove) [1] 10 8 9 1 4 6 7 
 x <- list("a", "b", "c", "d", "e"); # example list x[-2]; # without 2nd element x[-c(2, 3, 5)]; # without 2nd,3rd,5th element 

Vous pouvez le faire comme suit:

 > x<-c(2, 4, 6, 9, 10) # the list > y<-c(4, 9, 10) # values to be removed > idx = which(x %in% y ) # Positions of the values of y in x > idx [1] 2 4 5 > x = x[-idx] # Remove those values using their position and "-" operator > x [1] 2 6 

Prochainement

 > x = x[ - which(x %in% y)] 

au lieu de

 x <- x[! x %in% c(2,3,5)] 

en utilisant les paquets purrr et margrittr , vous pouvez faire:

 your_vector %<>% discard(~ .x %in% c(2,3,5)) 

Cela permet de sous-définir le nom du vecteur une seule fois. Et vous pouvez l'utiliser dans des tuyaux 🙂

Nous pouvons d’abord définir un nouvel opérateur,

 "%ni%" = Negate( "%in%" ) 

Alors, c’est comme x pas dans supprimer

 x <- 1:10 remove <- c(2,3,5) x <- x[ x %ni% remove ] 

ou pourquoi aller pour enlever, allez directement

 x <- x[ x %ni% c(2,3,5)] 

METTRE À JOUR:

Toutes les réponses ci-dessus ne fonctionneront pas pour les valeurs répétées, la réponse de @ BenBolker utilisant le prédicat duplicated() résout ce problème:

 full_vector[!full_vector %in% searched_vector | duplicated(full_vector)] 

Réponse originale: ici j’écris une petite fonction pour cela:

 exclude_val<-function(full_vector,searched_vector){ found=c() for(i in full_vector){ if(any(is.element(searched_vector,i))){ searched_vector[(which(searched_vector==i))[1]]=NA } else{ found=c(found,i) } } return(found) } 

alors, disons full_vector=c(1,2,3,4,1) et searched_vector=c(1,2,3) .

exclude_val(full_vector,searched_vector) renverra (4,1), cependant les réponses ci-dessus exclude_val(full_vector,searched_vector) juste (4) .

 q <- c(1,1,2,2,3,3,3,4,4,5,5,7,7) rm <- q[11] remove(rm) q q[13] = NaN q q %in% 7 

Cela définit le 13 dans un vecteur à pas un nombre (NAN), il montre faux supprimer (q [c (11,12,13)]) si vous essayez cela, vous verrez que la fonction de suppression ne fonctionne pas sur le nombre de vecteurs. vous supprimez tout le vecteur mais peut-être pas un seul élément.