2009-07-23 9 views
363

Dans R, comment testez-vous un vecteur pour voir s'il contient un élément donné?test si un vecteur contient un élément donné

+28

parfois, je me demande pourquoi R ne fonctionne tout simplement pas utiliser le mot contient pour le rendre plus facile les utilisateurs – greg121

+8

considèrent que « dans » est contenu dans "conta (in) s"; Je soutiens que "dans" est un concurrent considérablement concis dans ce contexte – hedgedandlevered

+1

Peut-être avec l'ajout de flanquant '%' -signs qui est. Le mot 'in' est un mot réservé dans R utilisé dans la construction en boucle. –

Répondre

373

Les fonctions match() (renvoie la première apparition) et %in% (renvoie une valeur booléenne) 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 
31

Vous pouvez utiliser l'opérateur %in%:

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

Le tout() fonction 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 
+4

Sachez que ceci se comporte différemment de '% in%': 'any (1 == NA)' renvoie 'NA', où' 1% dans% NA' renvoie 'FALSE'. – dash2

15

aussi trouver la position de l'élément "qui" peut être utilisé comme

pop <- c(3,4,5,7,13) 

which(pop==13) 

et de 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

'which' est en fait préférable parfois car cela vous donne * all * les positions correspondantes (comme un tableau), contrairement à' match'. Bien que ce n'était peut-être pas ce que le PO demandait, contrairement à http://stackoverflow.com/questions/1169388/finding-multiple-elements-in-a-vector – Fizz

+0

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

136

is.element() fait pour 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 
+5

Je sais que la documentation dit 'is.element (x, y) est identique à x% in% y'. Mais, je ne sais pas pourquoi, 'is.elements' fonctionne quand on mélange des nombres entiers et des nombres entiers et'% in% 'ne fonctionne pas – pomber

+0

@pomber: Pourriez-vous donner un exemple de ceci? – discipulus

8

Je vraiment comme grep() et grepl() dans ce but. Grep() renvoie un vecteur d'entiers, qui indiquent où se trouvent les correspondances

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.

+8

Par défaut, 'grep' prend une expression régulière comme premier élément, donc pour faire une correspondance exacte avec' "b" ', utilisez '^ e $' ou ajoutez ', fixed = TRUE'). – reinierpost

+8

N'utilisez pas regex pour les correspondances exactes. Ceci est dangereux et peut avoir des résultats inattendus –

+8

Oui, c'est une idée terrible, pas bonne, très mauvaise - inefficace et garantie de rupture. Par exemple. 'myvar <- 'blah'; grepl ('b', myvar, fixed = TRUE) 'retournera 'TRUE' même si' b 'n'est pas dans' myvar'. – dash2

15

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:

% en%

> 'a' %in% v 
[1] TRUE 

quelconque()

> any('a'==v) 
[1] TRUE 

est.élément()

> is.element('a', v) 
[1] TRUE 

Pour trouver la première occurance:

match de()

> match('a', v) 
[1] 2 

Pour trouver toutes les occurences comme vecteur d'indices:

qui()

> which('a' == v) 
[1] 2 4 

pour trouver toutes les occurrences comme vecteur logique:

==

> 'a' == v 
[1] FALSE TRUE FALSE TRUE FALSE 

Edit: Retrait grep() et Grepl() de la liste pour des raisons mentionnées dans les commentaires

+5

Comme déjà commenté [ici] (https://stackoverflow.com/questions/1169248/r-function-for-testing-if-a-vector-contains-a-given-element/34056066#comment66181358_34056066) et [ici] (https://stackoverflow.com/questions/1169248/r-function-for-testing-if-a-vector-contains-a-given-element/34056066#comment73025314_34056066), n'utilisez pas 'grep()' ou expressions régulières pour trouver des correspondances exactes. – Uwe

Questions connexes