J'essaie de trouver comment filtrer certaines observations d'un grand ensemble de données à l'aide de dplyr
et grepl
. Je ne suis pas marié à grepl
, si d'autres solutions seraient plus optimales.
Prenez cet exemple df:
df1 <- data.frame(fruit=c("Apple", "orange", "xapple", "xorange",
"applexx", "orangexx", "banxana", "appxxle"), group=c("A", "B") )
df1
# fruit group
#1 Apple A
#2 orange B
#3 xapple A
#4 xorange B
#5 applexx A
#6 orangexx B
#7 banxana A
#8 appxxle B
Je veux:
J'ai réussi à trouver comment me débarrasser de tout ce qui contient "x" ou "xx", mais sans commencer ni finir par. Voici comment se débarrasser de tout avec `` xx '' à l'intérieur (ne se terminant pas seulement par):
df1 %>% filter(!grepl("xx",fruit))
# fruit group
#1 Apple A
#2 orange B
#3 xapple A
#4 xorange B
#5 banxana A
Cela a évidemment "erronément" (de mon point de vue) filtré "appxxle".
Je n'ai jamais complètement maîtrisé les expressions régulières. J'ai essayé de modifier du code tel que: grepl("^(?!x).*$", df1$fruit, Perl = TRUE)
pour essayer de le faire fonctionner dans la commande de filtrage, mais je ne l'obtiens pas tout à fait.
Production attendue:
# fruit group
#1 Apple A
#2 orange B
#3 banxana A
#4 appxxle B
J'aimerais le faire dans dplyr
si possible.
Je n'ai pas compris votre deuxième expression régulière, mais cette expression plus simple semble faire l'affaire:
df1 %>% filter(!grepl("^x|xx$", fruit))
###
fruit group
1 Apple A
2 orange B
3 banxana A
4 appxxle B
Et je suppose que vous le savez, mais vous n'avez pas du tout besoin d'utiliser dplyr
ici:
df1[!grepl("^x|xx$", df1$fruit), ]
###
fruit group
1 Apple A
2 orange B
7 banxana A
8 appxxle B
L'expression régulière recherche des chaînes commençant par x
OR se terminant par xx
. Le ^
et $
sont des ancres d'expression régulière pour le début et la fin de la chaîne, respectivement. |
est l'opérateur OR. Nous annulons les résultats de grepl
avec le !
donc nous trouvons des chaînes qui ne correspondent pas à ce qui se trouve à l'intérieur de l'expression régulière.