2017-07-28 6 views
2

Je veux rechercher tout ce qui commence par 55 et tout ce qui a le mot Roof (sensible à la casse, pour ceux qui sont curieux) en elle.Est-il possible d'utiliser un opérateur AND dans grepl()?

Jusqu'à présent, je n'ai pas réussi, comme je ne peux pas sembler utiliser l'opérateur OR:

grepl("*^55|*Roof", dataset$longname) 

En fin de compte, je veux réaliser quelque chose comme ceci:

grepl("*^55&&*Roof", dataset$longname) 

ou

grepl("*^55&*Roof", dataset$longname) 

(De toute évidence, aucun de ces travaux - ils sont à titre d'illustration seulement.)

Je veux que mes résultats montrent quelque chose qui commence par 55 et qui a le mot Roof n'importe où dedans.

Par exemple, je me attends à ces deux résultats à repris par la fonction grepl():

55 - Roof Structure 

et

55-Wall to Roof 

Y at-il un opérateur AND qui peut être utilisé avec grepl()?

+0

Vous pourriez vouloir regarder [cette question] (https: // stackoverflow. com/questions/13187414/r-grep-est-là-un-et-opérateur) –

+0

Il est possible de dupliquer [r- grepl pour trouver plusieurs chaînes] (https://stackoverflow.com/questions/44152970/r-grepl -to-find-multiple-strings-exists) – AkselA

Répondre

4

Pour rechercher une chaîne ayant à la fois « a » et « b »

grepl("a", x) & grepl("b", x) 

ou

grepl("a.*b|b.*a", x) 

Si nous connaissons l'ordre des deux parties, nous pouvons omettre l'un des deux moitiés de la dernière grepl. Par exemple, dans le cas de la requête dans la question que ce serait suffisant pour trouver une chaîne qui commence par 55 et contient le toit

grepl("^55.*Roof", x) 
+0

Parfait! La deuxième option fonctionne le mieux pour moi car j'aime garder mon code aussi propre et concis que possible. J'ai opté pour: 'grepl (" *^55. * Toit ", dataset $ longname)' Merci. – MusTheDataGuy

+0

Est-il possible d'inclure plusieurs 'AND's, ou est-ce là où votre premier exemple arrive? Par exemple, puis-je faire 'grepl (" * 55. * Toit. * TOS ", dataset $ longname)'? J'ai essayé et il ne retourne aucun résultat, donc je devine pas. – MusTheDataGuy

+0

Si vous connaissez la commande, vous pouvez utiliser 'a. * B. * C' mais sinon vous pouvez utiliser plusieurs commandes' grepl' 'grepl (...) & grepl (...) & grepl (.. .) 'ou utiliser' a. * b. * c | a. * c. * b | b. * a. * c | b. * a. * c | c. * a. * b | c. * b. * a'. –

2

Je reposter une réponse par @Psidom comme son a été supprimé, mais était évolutive à n clauses AND. Si @Psidom Undeletes sa réponse, je vais supprimer celui-ci (j'ai voté à Undelete) mais je me sens la réponse est importante pour d'autres chercheurs:

s <- c("55 - Roof Structure", "55-Wall to Roof", 'd 55 Roof') 
grepl("(?=.*^55)^Roof", s, perl = TRUE) 
## [1] TRUE TRUE FALSE 

## 2 AND clauses 
grepl("^(?=.*^55)(?=.*Roof)(?=.*Wall)", s, perl = TRUE) 
## [1] FALSE TRUE FALSE