web-dev-qa-db-fra.com

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 sontPASles 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 existe une fonction qui le fait automatiquement.

99
Dail

L'opérateur %in% vous indique quels éléments figurent parmi les nombres à 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

Notez que ceci supprimera silencieusement les incomparables (des choses comme NA ou Inf) ainsi (alors qu'il gardera les valeurs en double dans a tant qu'elles ne sont pas listées dans remove). 

  • Si a peut contenir des incomparables, mais que remove ne le sera pas, nous pouvons utiliser match, en lui disant de renvoyer 0 pour les non-correspondances et les incomparables (%in% est un raccourci conventionnel pour match):

    > a <- c (a, NA, Inf)
    > a
     [1]  10   5   2   7   1   6   3   4   8   9  NA Inf
    > match (a, remove, nomatch = 0L, incomparables = 0L)
     [1] 0 3 1 0 0 0 2 0 0 0 0 0
    > a [match (a, remove, nomatch = 0L, incomparables = 0L) == 0L]
    [1]  10   7   1   6   4   8   9  NA Inf
    

    incomparables = 0 n'est pas nécessaire car les incomparables ne correspondront pas, mais je l'inclurais par souci de lisibilité.
    C’est, en fait, ce que setdiff fait en interne (mais sans le unique pour jeter les doublons dans a qui ne sont pas dans remove).

  • Si remove contient des incomparables, vous devrez les rechercher individuellement, par exemple.

    if (any (is.na (remove))) 
      a <- a [! is.na (a)]
    

    (Cela ne distingue pas NA de NaN mais le manuel R prévient de toute façon qu'il ne faut pas se fier à la différence)

    Pour Inf/-Inf, vous devrez cocher sign et is.finite 

168
cbeleites

Vous pouvez utiliser setdiff.

Donné

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

Ensuite

> a
 [1] 10  8  9  1  3  4  6  7  2  5
> setdiff(a, remove)
[1] 10  8  9  1  4  6  7
81
Brian Diggs
x <- list("a", "b", "c", "d", "e"); # example list

x[-2];       # without 2nd element

x[-c(2, 3, 5)]; # without 2nd,3rd,5th element
13
Vikram

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)]
6
ykpemre

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-utiliser le nom du vecteur une seule fois. Et vous pouvez l'utiliser dans les pipes :)

3
krishan404

On peut d'abord définir un nouvel opérateur,

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

Ensuite, c'est comme x pas dans retirer 

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

ou pourquoi aller pour enlever, aller directement 

x <- x[ x %ni% c(2,3,5)]
2
TheMI
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

Ceci définit le 13 dans un vecteur sur pas un nombre (NAN), mais indique false Remove (q [c (11,12,13)]) Si vous essayez ceci, vous verrez que la fonction remove ne travailler sur le numéro de vecteur . vous supprimez le vecteur entier mais peut-être pas un seul élément.

1
Mahendra

METTRE À JOUR:

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

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

Réponse originale: j'écris ici une petite fonction pour ceci:

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) retournera (4,1), cependant les réponses ci-dessus renverront juste (4).

1
Özgür

Il y a aussi subset qui peut être utile parfois:

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

> subset(a, !(a %in% bad))
[1]  9  7 10  6  8  1  4
0