2014-09-23 20 views
23

Próbuję opracować sposób filtrowania niektórych obserwacji z dużego zestawu danych przy użyciu dplyr i grepl. Nie jestem związana z grepl, jeśli inne rozwiązania byłyby bardziej optymalne.Filtrowanie obserwacji w dplyr w połączeniu z grepl

Weź tę próbkę 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 

chcę:

  1. filtr przypadki, rozpoczynające się od 'x'
  2. filtr przypadki, kończące się 'xx'

Udało mi się znaleźć sposób na pozbycie się wszystkiego, co zawiera "x" lub "xx", ale nie zaczynając od o r kończy się na. Oto w jaki sposób pozbyć się wszystkiego z „xx” w środku (nie tylko kończąc):

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

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

To oczywiście „błędnie” (z mojego punktu widzenia) filtruje „appxxle”.

Nigdy nie miałem do czynienia z wyrażeniami regularnymi. Próbowałem zmodyfikować kod, taki jak: grepl("^(?!x).*$", df1$fruit, perl = TRUE), aby spróbować uruchomić go w ramach polecenia filtru, ale nie całkiem go rozumiem.

wyjście z oczekiwaniami:

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

Chciałbym zrobić to wewnątrz dplyr jeśli to możliwe.

Odpowiedz

31

nie rozumiałem swoją drugą regex, ale tym bardziej podstawowe regex wydaje rade:

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

A ja zakładam, że wiedzą o tym, ale nie trzeba używać dplyr tutaj w ogóle :

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

regex szuka strun, które zaczynają się x ani kończyć xx. ^ i $ są kotwami regex odpowiednio dla początku i końca ciągu. | jest operatorem OR. Negujemy wyniki grepl z !, więc szukamy ciągów, które nie pasują do tego, co znajduje się w regex.