所以我有以下数据,比方说称为"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"]
但这只会将"严重风暴"返回为风暴(但忽略了"暴风雪"one_answers"大风")。非常感谢。
问题是您正在查找前面有空格的字符串" 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)
在regex中设置了是否忽略大小写。很酷。另一种方法是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)
我也不太擅长regexp,但有什么问题
ss <- c("TYPHOON","SEVERE STORM","TROPICAL STORM","SNOWSTORM AND HIGH WINDS")
grepl("STORM",ss) & !grepl("TROPICAL STORM",ss)
## [1] FALSE TRUE FALSE TRUE
类似的东西
x <- my_data$Storm.Type
grep("STORM", x)[!grep("STORM", x)%in%grep("TROPICAL", x)]