web-dev-qa-db-fra.com

Filtrage des observations dans dplyr en combinaison avec grepl

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:

  1. filtrer les cas commençant par "x"
  2. filtrer les cas se terminant par 'xx'

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.

30
jalapic

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.

39
Chase