2014-09-23 14 views
23

Sto cercando di capire come filtrare alcune osservazioni da un set di dati di grandi dimensioni utilizzando dplyr e grepl. Non sono sposato a grepl, se altre soluzioni sarebbero più ottimali.Filtraggio delle osservazioni in dplyr in combinazione con grepl

prendere questo campione 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 

Voglio:

  1. filtro quei casi che iniziano con 'x'
  2. filtro quei casi che terminano con 'xx'

Sono riuscito a capire come eliminare tutto ciò che contiene 'x' o 'xx', ma non iniziare con o r che termina con. Ecco come sbarazzarsi di tutto ciò con 'xx' all'interno (non solo termina con):

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

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

Questo, ovviamente, 'erroneamente' (dal mio punto di vista) filtrato 'appxxle'.

Non ho mai preso completamente in considerazione le espressioni regolari. Ho provato a modificare il codice come ad esempio: grepl("^(?!x).*$", df1$fruit, perl = TRUE) per provare a farlo funzionare all'interno del comando filtro, ma non riesco a ottenerlo.

risultato atteso:

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

Mi piacerebbe fare questo all'interno dplyr, se possibile.

risposta

31

non capivo la vostra seconda regex, ma questo regex più fondamentale sembra fare il trucco:

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

e presumo lo sai, ma non c'è bisogno di utilizzare dplyr qui a tutti :

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

L'espressione regolare è alla ricerca di stringhe che iniziano con x o terminare con xx. I numeri ^ e $ sono ancore regex rispettivamente per l'inizio e la fine della stringa. | è l'operatore OR. Stiamo annullando i risultati di grepl con lo ! in modo da trovare stringhe che non corrispondono a ciò che è all'interno della regex.

Problemi correlati