所以我有以下数据,比方说叫“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"]
但是这只会让“严重风暴”成为一场风暴(但不会让SNOWSTORM和HIGH WINDS失效)。谢谢!
答案 0 :(得分:9)
问题在于您正在查找带有前一个空格的字符串" 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", 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)
答案 1 :(得分:3)
我也不擅长正则表达式,但
出了什么问题ss <- c("TYPHOON","SEVERE STORM","TROPICAL STORM","SNOWSTORM AND HIGH WINDS")
grepl("STORM",ss) & !grepl("TROPICAL STORM",ss)
## [1] FALSE TRUE FALSE TRUE
......?
答案 2 :(得分:0)
类似
x <- my_data$Storm.Type
grep("STORM", x)[!grep("STORM", x)%in%grep("TROPICAL", x)]