2017-08-13 63 views
0
之外的所有字符串

我正在嘗試清理類項目的數據。這些數據涉及從1950年到2011年的NOAA Storm數據。風暴類型(EVTYPE)只應該是48個不同的級別,但是有超過1000個獨特的條目。我試圖找到所有的雪相關的條目,這給了我:R 3.4.1 Windows 10上的gsub - 查找並替換除

table(grep("snow", temp$EVTYPE, ignore.case = TRUE, value = TRUE)) 

    ACCUMULATED.SNOWFALL    BLOWING.SNOW    COLD.AND.SNOW    DRIFTING.SNOW 
        4       5       1       1 
     EARLY.SNOWFALL    EXCESSIVE.SNOW   FALLING.SNOW.ICE     FIRST.SNOW 
        7       25       2       2 
      HEAVY.SNOW   HEAVY.SNOW.SHOWER   HEAVY.SNOW.SQUALLS     ICE.SNOW 
       13988       1       1       4 
     LAKE.EFFECT.SNOW   LATE.SEASON.SNOW  LATE.SEASON.SNOWFALL     LATE.SNOW 
        656       1       3       2 
      LIGHT.SNOW  LIGHT.SNOW.FLURRIES LIGHT.SNOW.FREEZING.PRECIP    LIGHT.SNOWFALL 
        174       3       1       1 
     MODERATE.SNOW   MODERATE.SNOWFALL   MONTHLY.SNOWFALL    MOUNTAIN.SNOWS 
        1      101       1       1 
     RECORD.MAY.SNOW    RECORD.SNOW   RECORD.SNOWFALL   RECORD.WINTER.SNOW 
        1       2       2       3 
    SEASONAL.SNOWFALL      SNOW   SNOW.ACCUMULATION    SNOW.ADVISORY 
        1      425       1       1 
      SNOW.AND.ICE    SNOW.AND.SLEET   SNOW.BLOWING.SNOW    SNOW.DROUGHT 
        4       5       6       4 
       SNOW.ICE    SNOW.SHOWERS     SNOW.SLEET    SNOW.SQUALL 
        1       5       5       5 
      SNOW.SQUALLS   THUNDERSNOW.SHOWER  UNUSUALLY.LATE.SNOW 
        14       1       1 

有一個稱爲「Lake.Effect.Snow」風暴式,這是48種風暴類型之一。在排除特定風暴類型的情況下,如何替換所有其他條目?我試過了:

table(grep("([^lake]?)snow", temp$EVTYPE, ignore.case = TRUE, value = TRUE)) 

嘗試忽略Lake.Effect.Snow條目,但沒有好處。

+1

嘗試'「(?<!lake \\。effect \\。)snow」'並添加'perl = TRUE'。 –

+0

*我如何替換所有其他條目* - 但是您不用'grep'替換任何內容,只需提取匹配模式的條目即可。請澄清你的意思。 –

+0

我會使用gsub()來實際替換字符串,因爲那是我在控制檯中顯示的grep()代碼。 –

回答

0

使用stringr::str_detect與if.else。

library("stringr") 

temp$EVTYPE <- if.else(str_detect(temp$EVTYPE, regex("snow", ignore_case = TRUE)) & temp$EVTYPE != "Lake.Effect.Snow", "Snow", temp$EVTYPE)