J'essaie d'utiliser grep
pour tester si un vecteur de chaînes est présent ou non dans un autre vecteur, et pour sortir les valeurs présentes (les modèles correspondants).
J'ai une trame de données comme celle-ci:
FirstName Letter
Alex A1
Alex A6
Alex A7
Bob A1
Chris A9
Chris A6
J'ai un vecteur de modèles de chaînes à trouver dans les colonnes « Lettre », par exemple: c("A1", "A9", "A6")
.
Je voudrais vérifier si l'une des chaînes du vecteur de motif est présente dans la colonne "Lettre". S'ils le sont, je voudrais la sortie de valeurs uniques.
Le problème est que je ne sais pas comment utiliser grep
plusieurs modèles. J'ai essayé:
matches <- unique (
grep("A1| A9 | A6", myfile$Letter, value=TRUE, fixed=TRUE)
)
Mais cela me donne 0 correspondances, ce qui n'est pas vrai, des suggestions?
fixed=TRUE
car votre modèle est une véritable expression régulière.match
ou%in%
ou même==
est le seul moyen correct de comparer des correspondances exactes. regex est très dangereux pour une telle tâche et peut conduire à des résultats inattendus.Réponses:
En plus du commentaire de @ Marek sur la non-inclusion
fixed==TRUE
, vous devez également ne pas avoir d'espaces dans votre expression régulière. Ça devrait être"A1|A9|A6"
.Vous mentionnez également qu'il existe de nombreux modèles. En supposant qu'ils sont dans un vecteur
Ensuite, vous pouvez créer votre expression régulière directement en utilisant
paste
etcollapse = "|"
.la source
toMatch %in% myfile$Letter
?Bonnes réponses, mais n'oubliez pas
filter()
de dplyr:la source
grepl
fonctionne avec un motif à la fois (nous avons besoin d'un vecteur de longueur 1), nous avons 3 motifs (vecteur de longueur 3), nous pouvons donc les combiner avec un en utilisant un séparateur convivial pour grepl -|
, tentez votre chance avec d'autres :))|(
à des modèles séparés pourrait le rendre plus robuste:paste0("(", paste(patterns, collapse=")|("),")")
. Malheureusement, il devient également un peu moins élégant. Il en résulte un motif(A1)|(A9)|(A6)
.Cela devrait fonctionner:
Ou encore plus simplement:
la source
%like%
n'est pas dans la base R, vous devriez donc mentionner le (s) package (s) nécessaire (s) pour l'utiliser.%like%
fait partie dudata.table
package. Également en mêmedata.table
sontlike(...)
,%ilike%
et%flike%
.Basé sur l'article de Brian Digg, voici deux fonctions utiles pour filtrer les listes:
la source
Avez-vous essayé les fonctions
match()
oucharmatch()
?Exemple d'utilisation:
la source
match
est qu'il n'utilise pas de motifs, il s'attend à une correspondance exacte.Je ne sais pas si cette réponse est déjà apparue ...
Pour le modèle particulier de la question, vous pouvez simplement le faire avec un seul
grep()
appel,la source
Pour ajouter à la réponse de Brian Diggs.
une autre façon d'utiliser grepl renverra une trame de données contenant toutes vos valeurs.
Peut-être un peu plus propre ... peut-être?
la source
Otez les espaces. Alors faites:
la source
En utilisant le
sapply
la source
Je suggère d'écrire un petit script et de faire plusieurs recherches avec Grep. Je n'ai jamais trouvé un moyen de rechercher plusieurs modèles, et croyez-moi, j'ai cherché!
Comme ça, votre fichier shell, avec une chaîne intégrée:
Puis exécutez en tapant myshell.sh.
Si vous voulez pouvoir passer la chaîne sur la ligne de commande, faites-le comme ceci, avec un argument shell - c'est la notation bash btw:
Et ainsi de suite.
S'il y a beaucoup de modèles à faire correspondre, vous pouvez le mettre dans une boucle for.
la source