636 votes

Fonction R pour tester si un vecteur contient un élément donné

En R, comment tester un vecteur pour voir s'il contient un élément donné ?

48 votes

Je me demande parfois pourquoi R n'utilise pas le mot "contient" pour faciliter la tâche des utilisateurs.

23 votes

Considérez que "in" est contenu dans "conta(in)s" ; je dirais que "in" est un concurrent considérablement plus concis dans ce contexte.

1 votes

Peut-être qu'avec l'ajout de flancs % c'est-à-dire des signes. Le mot in est un mot réservé en R utilisé dans la construction des boucles for.

601voto

medriscoll Points 4479

Les deux match() (rend la première apparition) et %in% (renvoie 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

0 votes

Pourquoi ne pas obtenir toutes les apparitions, et pas seulement la première ?

1 votes

J'arrive peut-être un peu tard. which(v, 'b') . Attention à l'ordre des arguments.

0 votes

Votre which(v, 'b') me donne un message d'erreur : >Erreur dans which(v, 'b') : l'argument de 'which' n'est pas logique

205voto

Justin Nafe Points 499

is.element() permet de rendre 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

8 votes

Je sais que la documentation dit is.element(x, y) is identical to x %in% y . Mais, je ne sais pas pourquoi, is.elements fonctionne lorsque l'on mélange des entiers et des numériques et %in% n'a pas

0 votes

@pomber : Pouvez-vous donner un exemple de cela ?

0 votes

@pomber c'est réparé ?

71voto

Dan Goldstein Points 2970

El tout() permet d'obtenir un 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

11 votes

Soyez conscient que cela se comporte différemment de %in% : any(1==NA) renvoie à NA , donde 1 %in% NA renvoie à FALSE .

0 votes

@user3603486 : any(1==NA, na.rm=TRUE) renvoie à FALSE .

37voto

ars Points 35803

Vous pouvez utiliser le %in% opérateur :

vec <- c(1, 2, 3, 4, 5)
1 %in% vec # true
10 %in% vec # false

20voto

Armin Points 71

De même, pour trouver la position de l'élément "lequel" 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))]

0 votes

which est en fait parfois préférable car elle vous donne tous les positions correspondantes (sous forme de tableau), contrairement à match . Bien que ce ne soit peut-être pas ce que le PO a demandé, contrairement aux stackoverflow.com/questions/1169388/

2 votes

Pourquoi s'embêter avec which si vous voulez juste trouver les éléments qui ne sont pas dans Tset ? Vous pouvez simplement indexer pop directement ; pop[!pop%in%Tset]

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