所以我有以下数据,我们来说叫做“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"]
但这只会将“严重的风险”作为暴风雨返回(但是忽略了雪域和高风险).谢谢!
问题是您正在寻找具有前面空格的字符串“STORM”,因此“SNOWSTORM”不符合条件.
作为一个修复,考虑将空间移动到你的负面的lookbehind断言,像这样:
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",perl = TRUE) # [1] FALSE TRUE FALSE TRUE TRUE
我不知道(?i)和(?-i)设置是否在正则表达式中忽略大小写.酷找.另一种方法是ignore.case标志:
grepl("(?<!tropical )storm",perl = TRUE,ignore.case = TRUE) # [1] FALSE TRUE FALSE TRUE TRUE
然后定义您的列:
my_data$Is.Storm <- grepl("(?<!tropical )storm",my_data$Storm.Type,ignore.case = TRUE)