2013-11-22 107 views
10

所以我有以下的數據,讓我們說叫「my_data」:正則表達式與負回顧後

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"] 

但是,這隻會讓暴風雪「重大風暴」(但會導致雪暴和高風險)。謝謝!

+0

什麼''在你的正則表達式的點(我?)?問題是你正在尋找帶有前面空格的字符串「STORM」,所以「SNOWSTORM」沒有資格。 –

+1

嗨藍。雖然我接受了本的回答,但您實際上已經通過我的代碼瞭解了問題的核心。我想製作我的代碼,以便它不關心這個空間(所以如果STORM在THUNDERSTORM或SNOWSTORM中,我想要和STORM一樣)。你知道我如何擺脫我的代碼正在尋找的空間嗎? (?i)的意思是有人進入STORM爲「storm」或「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'參數,但對於一般的PCRE表達式來說'(?i)'更靈活。 –

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

謝謝!這絕對有效。 –