2013-11-22 3 views
10

назад 'Таким образом, у меня есть следующие данные, скажем, под названием «my_data»:Регулярное выражение в R с отрицательным

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

То, что я хочу, чтобы классифицировать ли не каждый элемент в my_data $ Storm.Type является шторм, но я не хочу, чтобы включать в себя тропические штормы, как штормы (я буду классифицировать их по отдельности), такие, что я бы

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

Я написал следующий код:

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

Но это только возвращает «SEVERE STORM» как буря (но не оставляет SNOWSTORM AND HIGH WINDS). Спасибо!

+0

Что точка '' в ваше регулярное выражение (я?)? Проблема в том, что вы ищете строку '' STORM ''с предыдущим пространством, поэтому' 'SNOWSTORM'' не подходит. –

+1

Hi Blue. Пока я принимал ответ Бена, вы на самом деле дошли до сути проблемы с MY-кодом. Я хотел бы сделать свой код так, чтобы он не заботился об этом пространстве (поэтому, если STORM находится в THUNDERSTORM или SNOWSTORM, я хочу это, а также STORM самостоятельно). Вы знаете, как я избавлюсь от этого пространства, которое ищет мой код? Точка (? I) - это шанс, что кто-то вошел в STORM как «шторм» или «Шторм» или «sToRm» и т. Д. –

ответ

8

Проблема в том, что вы ищете строку " STORM" с предыдущим пространством, поэтому "SNOWSTORM" не подлежит определению.

Как исправить, рассмотреть вопрос о переходе пространства в ваши негативные утверждения касательно предшествующего текста, например, так:

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 

Я не знал, что (?i) и (?-i) набора игнорировать ли вы дело или нет в регулярных выражениях. Крутая находка. Другой способ сделать это является ignore.case флаг:

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

Затем определите столбец:

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

УДИВИТЕЛЬНЫЙ !!!!!!!!!! –

+1

Добро пожаловать. Спасибо, что преподал мне о '(? I)'. Я использую аргумент 'ignore.case', но' (? I) 'более гибкий для общих выражений PCRE. –

0

что-то вроде

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

Я не так хорош в регулярных выражениях либо, но то, что случилось с

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

...?

+0

Спасибо! Это определенно сработало. –

Смежные вопросы