2013-11-22 9 views
10

Così ho i seguenti dati, diciamo chiamato "my_data":Regular Expression in R con un lookbehind negativo

Storm.Type 
TYPHOON 
SEVERE STORM 
TROPICAL STORM 
SNOWSTORM AND HIGH WINDS 

Quello che voglio è quello di classificare o meno ogni elemento in my_data $ Storm.Type è una tempesta, ma io non voglio includere tempeste tropicali come tempeste (ho intenzione di classificarli separatamente), in modo tale che avrei dovuto

Storm.Type     Is.Storm 
TYPHOON      0 
SEVERE STORM     1 
TROPICAL STORM    0 
SNOWSTORM AND HIGH WINDS  1 

ho scritto il seguente codice:

my_data$Is.Storm <- my_data[grep("(?<!TROPICAL) (?i)STORM"), "Storm.Type"] 

Ma questo restituisce la "TEMPESTA TEMPESTA" solo come una tempesta (ma lascia fuori SNOWSTORM E HIGH WINDS). Grazie!

+0

Qual è il punto di '' nella vostra espressione regolare (i?)? Il problema è che stai cercando la stringa '" STORM "' con uno spazio precedente, quindi '" SNOWSTORM "' non si qualifica. –

+1

Ciao Blue. Mentre ho accettato la risposta di Ben, hai effettivamente raggiunto il cuore del problema con il mio codice. Mi piacerebbe creare il mio codice in modo che non si preoccupi di quello spazio (quindi se STORM è in THUNDERSTORM o SNOWSTORM, voglio che sia così come STORM da solo). Sai come mi libererei di quello spazio che il mio codice sta cercando? Il punto di (? I) è la possibilità che qualcuno entri in una tempesta come "tempesta" o "tempesta" o "sToRm", ecc. –

risposta

8

Il problema è che si sta cercando la stringa " STORM" con uno spazio precedente, quindi "SNOWSTORM" non è idonea.

come una correzione, prevedere il passaggio lo spazio nella vostra affermazione lookbehind negativo, in questo modo:

ss <- c("TYPHOON","SEVERE STORM","TROPICAL STORM","SNOWSTORM AND HIGH WINDS", 
     "THUNDERSTORM") 
grep("(?<!TROPICAL)(?i)STORM", ss, perl = TRUE) 
# [1] 2 4 5 
grepl("(?<!TROPICAL)(?i)STORM", ss, perl = TRUE) 
# [1] FALSE TRUE FALSE TRUE TRUE 

Non sapevo che (?i) e (?-i) impostare se si ignora caso o no in regex. Bella scoperta. Un altro modo per farlo è la bandiera ignore.case:

grepl("(?<!tropical)storm", ss, perl = TRUE, ignore.case = TRUE) 
# [1] FALSE TRUE FALSE TRUE TRUE 

quindi definire la colonna:

my_data$Is.Storm <- grepl("(?<!tropical)storm", my_data$Storm.Type, 
          perl = TRUE, ignore.case = TRUE) 
+0

FANTASTICO !!!!!!!!!! –

+1

Prego. Grazie per avermi insegnato a proposito di '(? I)'. Sono abituato ad usare l'argomento 'ignore.case', ma' (? I) 'è più flessibile per le espressioni generali PCRE. –

0

qualcosa come

x <- my_data$Storm.Type 
grep("STORM", x)[!grep("STORM", x)%in%grep("TROPICAL", x)] 
3

Non sono così bravo a espressioni regolari sia, ma che c'è di male

ss <- c("TYPHOON","SEVERE STORM","TROPICAL STORM","SNOWSTORM AND HIGH WINDS") 
grepl("STORM",ss) & !grepl("TROPICAL STORM",ss) 
## [1] FALSE TRUE FALSE TRUE 

...?

+0

Grazie! Questo ha sicuramente funzionato. –

Problemi correlati