parfois je me demande pourquoi R n'utilise pas le mot contient pour rendre les utilisateurs plus faciles
greg121
12
considérer que "in" est contenu dans "conta (in) s"; Je dirais que "in" est un concurrent considérablement concis dans ce contexte
hedgedandlevered
1
Peut-être avec l'ajout de %signes flanquants . Le mot inest un mot réservé dans R utilisé dans la construction de boucles for.
IRTFM
@ greg121 dplyr a déjà une fonction contient , mais elle est utilisée dans un autre but: sélectionner une colonne dans un bloc de données. Par exemple select(iris, contains("etal")).
Paul Rougieux
Existe-t-il un moyen concis de le faire pour des nombres réels avec une précision donnée?
mlt
Réponses:
500
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
qu'en est-il d'obtenir toutes les apparences, pas seulement la première?
StatsSorceress
Je viens peut-être un peu tard. which(v, 'b'). Attention à l'ordre des arguments.
Niklas Mertsch
Votre which(v, 'b')me donne un message d'erreur:> Erreur dans laquelle (v, 'b'): argument à 'qui' n'est pas logique
Capt.Krusty
176
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
Je sais que la documentation dit is.element(x, y) is identical to x %in% y. Mais, je ne sais pas pourquoi, is.elementsfonctionne lors du mélange d'entiers et de chiffres et %in%ne fonctionne pas
pomber
@pomber: Pouvez-vous en donner un exemple?
discipulus
@pomber est-il réparé?
vasili111
2
La lisibilité supérieure 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 fruitest logique, fruit in applenon. is.element(apple, fruit)ou is.element(fruit, apple)pourraient tous deux avoir raison selon la mise en œuvre de la is.elementfonction.
rileymcdowell
70
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]24
Pour trouver toutes les occurrences comme vecteur logique :
==
>'a'== v
[1]FALSETRUEFALSETRUEFALSE
Edit: Suppression de grep () et grepl () de la liste pour la raison mentionnée dans les commentaires
whichest 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/…
Fizz
2
Pourquoi vous embêter whichsi vous voulez juste trouver les éléments qui ne s'y trouvent pas Tset? Vous pouvez simplement indexer popdirectement; pop[!pop%in%Tset]
Houshalter
13
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]34
grepl () renvoie un vecteur logique, avec "TRUE" à l'emplacement des correspondances.
yo <- c("a","a","b","b","c","c")
grepl("b", yo)[1]FALSEFALSETRUETRUEFALSEFALSE
Par défaut, grepprend une expression régulière comme premier élément, donc pour faire une correspondance exacte pour "b", utilisez ^e$ou ajoutez , fixed=TRUE).
reinierpost
10
N'utilisez pas l'expression régulière pour les correspondances exactes. Ceci est dangereux et peut avoir des résultats inattendus
David Arenburg
9
Oui, c'est une idée terrible, pas bonne, très mauvaise - inefficace et garantie de casser. Par exemple myvar <- 'blah'; grepl('b', myvar, fixed=TRUE), reviendra TRUEmême si «b» n'est pas dedans myvar.
%
signes flanquants . Le motin
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.la source
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 logiqueis.element()
rend le code plus lisible et est identique à%in%
la source
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 pasis.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)
ouis.element(fruit, apple)
pourraient tous deux avoir raison selon la mise en œuvre de lais.element
fonction.Je vais regrouper les options en fonction de la sortie. Supposons le vecteur suivant pour tous les exemples.
Pour vérifier la présence:
%dans%
tout()
is.element ()
Pour trouver la première occurrence:
rencontre()
Pour trouver toutes les occurrences comme vecteur d'indices:
lequel()
Pour trouver toutes les occurrences comme vecteur logique :
==
Edit: Suppression de grep () et grepl () de la liste pour la raison mentionnée dans les commentaires
la source
grep()
expressions régulières pour trouver des correspondances exactes.La fonction any () rend le code lisible
la source
%in%
:any(1==NA)
retoursNA
, où1 %in% NA
retoursFALSE
.any(1==NA, na.rm=TRUE)
renvoieFALSE
.Vous pouvez utiliser l'
%in%
opérateur:la source
Aussi pour trouver la position de l'élément "qui" peut être utilisé comme
et pour trouver les éléments qui ne sont pas contenus dans le vecteur cible, on peut faire ceci:
la source
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 pasTset
? Vous pouvez simplement indexerpop
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.
grepl () renvoie un vecteur logique, avec "TRUE" à l'emplacement des correspondances.
Ces fonctions sont sensibles à la casse.
la source
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
).myvar <- 'blah'; grepl('b', myvar, fixed=TRUE)
, reviendraTRUE
même si «b» n'est pas dedansmyvar
.