2013-11-22 24 views
10

Yani şu veriler var, en sözde "my_data" diyelim: İstediğim my_data $ Storm.Type her eleman olup olmadığı sınıflandırmak etmektirNormal İfade

Storm.Type 
TYPHOON 
SEVERE STORM 
TROPICAL STORM 
SNOWSTORM AND HIGH WINDS 

my_data$Is.Storm <- my_data[grep("(?<!TROPICAL) (?i)STORM"), "Storm.Type"] 
: bir fırtına ANCAK ben

Storm.Type     Is.Storm 
TYPHOON      0 
SEVERE STORM     1 
TROPICAL STORM    0 
SNOWSTORM AND HIGH WINDS  1 

aşağıdaki kodu yazdım olurdu öyle ki fırtınalar gibi tropik fırtınalar (ben bunları ayrı ayrı sınıflandırmak için gidiyorum) dahil etmek istemiyoruz

Ancak, bu yalnızca "SEVERE STORM" u fırtına olarak döndürür (ancak SNOWSTORM VE YÜKSEK KAZANLAR çıkarır). Teşekkür ederim!

+0

'' daki regexp ne anlamı var (i?):

grepl("(?<!tropical)storm", ss, perl = TRUE, ignore.case = TRUE) # [1] FALSE TRUE FALSE TRUE TRUE 

Sonra sütun tanımlamak? Sorun şu ki, "STORM" karakterini bir önceki boşlukla arıyoruz, yani "SNOWSTORM" 'e sahip değilsiniz. –

+1

Merhaba Mavi. Ben'in cevabını kabul etmekteyken, gerçekte MY koduyla sorunun kalbini aldınız. Kodumu, o alanı umursamayacak şekilde yapmak istiyorum (eğer STORM, THUNDERSTORM, ya da SNOWSTORM ise, STORM'un yanı sıra bunu istiyorum). Kodumun aradığı yerden nasıl kurtulacağımı biliyor musun? (? I) 'nin anlamı, birisinin STORM'a "fırtına" ya da "Fırtına" ya da "sToRm" vb. Girmiş olma ihtimalidir. –

cevap

8

Sorun, bir boşluk ile " STORM" dizesini aradığınızdır, bu nedenle "SNOWSTORM" uygun olmaz.

bir düzeltme olarak, bu yüzden gibi, negatif olan ileriye dönük iddianın içine alan taşımayı düşünün:

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 

Sana regex davayı görmezden olsun ya da olmasın (?i) ve (?-i) set bilmiyordum. Serin bul. Bunu yapmanın bir başka yolu ignore.case bayrağıdır:

my_data$Is.Storm <- grepl("(?<!tropical)storm", my_data$Storm.Type, 
          perl = TRUE, ignore.case = TRUE) 
+0

AWESOME !!!!!!!!!! –

+1

Rica ederim. Bana öğrettiğin için teşekkür ederim (? I) '. Ben 'ignore.case' argümanını kullanıyorum ama' (? I) 'genel PCRE ifadeleri için daha esnektir. –

0

x <- my_data$Storm.Type 
grep("STORM", x)[!grep("STORM", x)%in%grep("TROPICAL", x)] 
3

Ben de regexp'ler o kadar iyi değilim ama ne

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

nesi böyle bir şey ...?

+0

Teşekkür ederiz! Bu kesinlikle işe yaradı. –