13

所以我有以下数据,比如说“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)。谢谢!

4

3 回答 3

10

问题是您正在寻找" 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)
于 2013-11-22T21:05:23.400 回答
3

我也不擅长正则表达式,但有什么问题

ss <- c("TYPHOON","SEVERE STORM","TROPICAL STORM","SNOWSTORM AND HIGH WINDS")
grepl("STORM",ss) & !grepl("TROPICAL STORM",ss)
## [1] FALSE  TRUE FALSE  TRUE

... ?

于 2013-11-22T20:41:49.120 回答
0

就像是

x <- my_data$Storm.Type
grep("STORM", x)[!grep("STORM", x)%in%grep("TROPICAL", x)]
于 2013-11-22T20:40:52.663 回答