Comment vérifier si un vecteur contient une valeur donnée?
%
signes flanquants . Le mot in
est un mot réservé dans R utilisé dans la construction de boucles for.
select(iris, contains("etal"))
.
Comment vérifier si un vecteur contient une valeur donnée?
%
signes flanquants . Le mot in
est un mot réservé dans R utilisé dans la construction de boucles for.
select(iris, contains("etal"))
.
Réponses:
Les fonctions match()
(retourne la première apparition) et %in%
(retourne un booléen) sont conçues pour cela.
v <- c('a','b','c','e')
'b' %in% v
## returns TRUE
match('b',v)
## returns the first location of 'b', in this case: 2
which(v, 'b')
. Attention à l'ordre des arguments.
which(v, 'b')
me donne un message d'erreur:> Erreur dans laquelle (v, 'b'): argument à 'qui' n'est pas logique
is.element()
rend le code plus lisible et est identique à %in%
v <- c('a','b','c','e')
is.element('b', v)
'b' %in% v
## both return TRUE
is.element('f', v)
'f' %in% v
## both return FALSE
subv <- c('a', 'f')
subv %in% v
## returns a vector TRUE FALSE
is.element(subv, v)
## returns a vector TRUE FALSE
is.element(x, y) is identical to x %in% y
. Mais, je ne sais pas pourquoi, is.elements
fonctionne lors du mélange d'entiers et de chiffres et %in%
ne fonctionne pas
is.element()
vs %in%
est subjective. On peut faire valoir qu'un opérateur infixe est plus lisible car il élimine l'ambiguïté dans l'ordre des arguments. apple in fruit
est logique, fruit in apple
non. is.element(apple, fruit)
ou is.element(fruit, apple)
pourraient tous deux avoir raison selon la mise en œuvre de la is.element
fonction.
Je vais regrouper les options en fonction de la sortie. Supposons le vecteur suivant pour tous les exemples.
v <- c('z', 'a','b','a','e')
Pour vérifier la présence:
%dans%
> 'a' %in% v
[1] TRUE
tout()
> any('a'==v)
[1] TRUE
is.element ()
> is.element('a', v)
[1] TRUE
Pour trouver la première occurrence:
rencontre()
> match('a', v)
[1] 2
Pour trouver toutes les occurrences comme vecteur d'indices:
lequel()
> which('a' == v)
[1] 2 4
Pour trouver toutes les occurrences comme vecteur logique :
==
> 'a' == v
[1] FALSE TRUE FALSE TRUE FALSE
Edit: Suppression de grep () et grepl () de la liste pour la raison mentionnée dans les commentaires
La fonction any () rend le code lisible
> w <- c(1,2,3)
> any(w==1)
[1] TRUE
> v <- c('a','b','c')
> any(v=='b')
[1] TRUE
> any(v=='f')
[1] FALSE
%in%
: any(1==NA)
retours NA
, où 1 %in% NA
retours FALSE
.
any(1==NA, na.rm=TRUE)
renvoie FALSE
.
Aussi pour trouver la position de l'élément "qui" peut être utilisé comme
pop <- c(3,4,5,7,13)
which(pop==13)
et pour trouver les éléments qui ne sont pas contenus dans le vecteur cible, on peut faire ceci:
pop <- c(1,2,4,6,10)
Tset <- c(2,10,7) # Target set
pop[which(!(pop%in%Tset))]
which
est en fait parfois préférable car il vous donne toutes les positions correspondantes (sous forme de tableau), contrairement à match
. Bien que ce ne soit peut-être pas ce que l'OP demandait, contrairement à stackoverflow.com/questions/1169388/…
which
si vous voulez juste trouver les éléments qui ne s'y trouvent pas Tset
? Vous pouvez simplement indexer pop
directement; pop[!pop%in%Tset]
J'aime vraiment grep () et grepl () à cet effet.
grep () renvoie un vecteur d'entiers, qui indiquent où se trouvent les correspondances.
yo <- c("a", "a", "b", "b", "c", "c")
grep("b", yo)
[1] 3 4
grepl () renvoie un vecteur logique, avec "TRUE" à l'emplacement des correspondances.
yo <- c("a", "a", "b", "b", "c", "c")
grepl("b", yo)
[1] FALSE FALSE TRUE TRUE FALSE FALSE
Ces fonctions sont sensibles à la casse.
grep
prend une expression régulière comme premier élément, donc pour faire une correspondance exacte pour "b"
, utilisez ^e$
ou ajoutez , fixed=TRUE
).