所以我有以下数据,假设称为“my_data”:
Storm.Type
TYPHOON
SEVERE STORM
TROPICAL STORM
SNOWSTORM AND HIGH WINDS
我想要的是对 my_data$Storm.Type 中的每个元素是否是 Storm 进行分类,但我不想将热带 Storm 包括为 Storm (我将分别对它们进行分类),这样我就会有
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”返回为 Storm (但不包括暴风雪和大风)。谢谢!
最佳答案
问题是您正在寻找字符串 " 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)
关于regex - R 中的正则表达式,带有负向后视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20153959/