2014-09-23 6 views
23

Ich versuche herauszufinden, wie man einige Beobachtungen aus einem großen Datensatz mit dplyr und grepl filtern kann. Ich bin nicht mit grepl verheiratet, wenn andere Lösungen optimal wären.Filtern von Beobachtungen in dplyr in Kombination mit grepl

Nehmen Sie diese Probe 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 

Ich möchte:

  1. Filter jene Fälle, beginnend mit 'x'
  2. Filter, um diese Fälle mit der Endung 'xx' aus

Ich habe es geschafft, herauszufinden, wie man alles loswerden kann, das 'x' oder 'xx' enthält, aber nicht mit o beginnt endend mit. Hier ist, wie mit ‚xx‘ los, um alles im Innern (nicht nur mit der Endung):

df1 %>% filter(!grepl("xx",fruit)) 

# fruit group 
#1 apple  A 
#2 orange  B 
#3 xapple  A 
#4 xorange  B 
#5 banxana  A 

Das ist offensichtlich ‚irrtümlich‘ (aus meiner Sicht) gefiltert ‚appxxle‘.

Ich habe mich nie richtig mit regulären Ausdrücken beschäftigt. Ich habe versucht, Code wie: grepl("^(?!x).*$", df1$fruit, perl = TRUE) zu ändern, um zu versuchen, es innerhalb des Filterbefehls zu arbeiten, aber ich bin nicht ganz dabei.

Erwarteter Ausgang:

#  fruit group 
#1  apple  A 
#2 orange  B 
#3 banxana  A 
#4 appxxle  B 

Ich möchte diese, wenn möglich, innerhalb dplyr zu tun.

Antwort

31

Ich habe nicht Ihre zweite regex verstehen, aber diese grundlegen regex scheint den Trick zu tun:

df1 %>% filter(!grepl("^x|xx$", fruit)) 
### 
    fruit group 
1 apple  A 
2 orange  B 
3 banxana  A 
4 appxxle  B 

Und ich nehme an, Sie wissen das, aber Sie haben nicht dplyr hier zu verwenden, überhaupt :

df1[!grepl("^x|xx$", df1$fruit), ] 
### 
    fruit group 
1 apple  A 
2 orange  B 
7 banxana  A 
8 appxxle  B 

Die Regex sucht nach Zeichenfolgen, die mit x oder enden mit xx starten. Die ^ und $ sind Regex-Anker für den Anfang und das Ende der Zeichenfolge. | ist der ODER-Operator. Wir negieren die Ergebnisse von grepl mit der !, so dass wir Strings finden, die nicht mit denen in der Regex übereinstimmen.