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é
Répondre
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
Vous pouvez utiliser l'opérateur %in%
:
vec <- c(1, 2, 3, 4, 5)
1 %in% veC# true
10 %in% veC# false
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
Sachez que ceci se comporte différemment de '% in%': 'any (1 == NA)' renvoie 'NA', où' 1% dans% NA' renvoie 'FALSE'. – dash2
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))]
'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
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
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
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
@pomber: Pourriez-vous donner un exemple de ceci? – discipulus
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.
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
N'utilisez pas regex pour les correspondances exactes. Ceci est dangereux et peut avoir des résultats inattendus –
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
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
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
parfois, je me demande pourquoi R ne fonctionne tout simplement pas utiliser le mot contient pour le rendre plus facile les utilisateurs – greg121
considèrent que « dans » est contenu dans "conta (in) s"; Je soutiens que "dans" est un concurrent considérablement concis dans ce contexte – hedgedandlevered
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. –