L' %in%
opérateur 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 cela supprimera silencieusement les incomparables (des trucs comme NA
ou Inf)
aussi (alors que cela conservera les valeurs en double a
tant qu'elles ne sont pas répertoriées dans remove
).
Si a
peut contenir des incomparables, mais remove
ne le fera pas, nous pouvons l'utiliser match
, en lui disant de retourner 0
pour les non-matches 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 correspondent de toute façon pas, mais je l'inclurais pour des raisons de lisibilité.
C'est, btw., Ce qui setdiff
fait en interne (mais sans unique
jeter les doublons dans a
lesquels ne sont pas remove
).
Si remove
contient des incomparables, vous devrez les vérifier individuellement, par exemple
if (any (is.na (remove)))
a <- a [! is.na (a)]
(Cela ne distingue pas NA
de NaN
mais le manuel de R avertit de toute façon que l' on ne doit pas compter sur avoir une différence entre eux)
Pour Inf
/ -Inf
vous devrez cocher à la fois sign
etis.finite
cbeleites mécontents de SX
la source
setdiff
est mieux, car il fait tout en une seule opération et référence le vecteur modifié une seule fois.a
qui ne sont pasremove
également présents. Si ce n'est pas un problème, vous pouvez également utilisersetdiff
.setdiff
, btw, utilisematch
pour qui%in%
est un raccourci.Vous pouvez utiliser
setdiff
.Donné
ensuite
la source
a
est le résultat d'une autre fonction afin que vous puissiez faire des choses sur une ligne au lieu de 3 et une variable temporaire%in%
solution si le vecteur d'entrée contient des doublons (auquel cassetdiff
ne renverra que l' ensemble unique , c'est-à-dire sans doublons)fsetdiff
dudata.table
package a unall
flag (F par défaut) qui permet de conserver les doublons dans le vecteur d'entrée.Vous pouvez le faire comme suit:
Prochainement
la source
which
ici. C'est fondamentalement la même chose que la réponse @cbeleites.which
renvoie des index de valeurs TRUE. Le signe moins peut donc être utilisé pour dire "les index autres que ces index". Est égalementwhich
plus lisible car il est plus proche du langage naturel.au lieu de
en utilisant les packages
purrr
etmagrittr
, vous pouvez faire:cela permet d'
subset
utiliser le nom du vecteur une seule fois. Et vous pouvez l'utiliser dans les tuyaux :)la source
Tout d'abord, nous pouvons définir un nouvel opérateur,
Ensuite, c'est comme x pas en retrait
ou pourquoi opter pour la suppression, allez directement
la source
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
duplicated()
prédicat résout ceci:Réponse originale: ici, j'écris une petite fonction pour cela:
alors, disons
full_vector=c(1,2,3,4,1)
etsearched_vector=c(1,2,3)
.exclude_val(full_vector,searched_vector)
retournera (4,1), mais les réponses ci-dessus ne retourneront que(4)
.la source
full_vector[!full_vector %in% searched_vector | duplicated(full_vector)]
?full_vector = c(1,1,1,2,3); searched_vector = c(1,1,3);
- cela produit1, 1, 2
au lieu de la bonne réponse1, 2
.removeif <- function(from, where) { for (i in where) if (i %in% from) {from = from[-match(i, from)]}; from}
Cela définit le 13 dans un vecteur à pas un nombre (NAN), il montre false remove (q [c (11,12,13)]) si vous essayez cela, vous verrez que la fonction de suppression ne fonctionne pas sur le nombre de vecteur. vous supprimez le vecteur entier mais peut-être pas un seul élément.
la source
Il y a aussi
subset
ce qui peut être utile parfois:la source