2013-11-22 14 views
10

तो मैं निम्नलिखित डेटा है, मान लीजिए कि तथाकथित "my_data" करते हैं:नियमित अभिव्यक्ति

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

क्या मैं चाहता हूँ वर्गीकृत करने के लिए किया जाए या नहीं my_data $ Storm.Type में प्रत्येक तत्व है

my_data$Is.Storm <- my_data[grep("(?<!TROPICAL) (?i)STORM"), "Storm.Type"] 
: एक तूफान, लेकिन मैं नहीं है (मैं उन्हें अलग से वर्गीकृत करने के लिए जा रहा हूँ) तूफान के रूप में उष्णकटिबंधीय तूफान, ऐसा है कि मैं

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

मैं निम्नलिखित कोड लिखा है के लिए होगा शामिल करना चाहते हैं

लेकिन यह केवल तूफान के रूप में "सेवर स्टॉर्म" लौटाता है (लेकिन स्नोस्टोरम और उच्च वाइंड्स छोड़ देता है)। धन्यवाद!

+0

'अपने regexp' में का फ़ायदा क्या है (मैं?):

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

फिर अपने स्तंभ को परिभाषित? समस्या यह है कि आप पहले की जगह के साथ स्ट्रिंग 'STORM" की तलाश में हैं, इसलिए '" SNOWSTORM "योग्य नहीं है। –

+1

हाय ब्लू। जबकि मैंने बेन के जवाब को स्वीकार किया, तो आप वास्तव में मेरे कोड के साथ समस्या के दिल में आ गए हैं। मैं अपना कोड बनाना चाहता हूं ताकि उसे उस स्थान की परवाह न हो (इसलिए यदि STORM थंडरस्टोरम में है, या SNOWSTORM, मैं चाहता हूं कि साथ ही साथ STORM भी)। क्या आप जानते हैं कि मैं उस स्थान से कैसे छुटकारा पाउंगा जो मेरा कोड ढूंढ रहा है? (? I) का बिंदु ऑफ़-मौका है कि किसी ने STORM को "तूफान" या "तूफान" या "एसटीओआरएम" आदि के रूप में दर्ज किया है, –

उत्तर

8

समस्या यह है कि आप पिछले स्थान के साथ " STORM" स्ट्रिंग की तलाश में हैं, इसलिए "SNOWSTORM" योग्य नहीं है।

एक फिक्स के रूप में, अपने नकारात्मक lookbehind अभिकथन में अंतरिक्ष चलती है, तो जैसे पर विचार करें:

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 झंडा है:

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

अद्भुत !!!!!!!!!! –

+1

आपका स्वागत है। मुझे '(? I)' के बारे में सिखाने के लिए धन्यवाद। मैं 'ignore.case' तर्क का उपयोग करने के लिए प्रयोग किया जाता हूं, लेकिन '(? I)' सामान्य पीसीआरई अभिव्यक्तियों के लिए अधिक लचीला है। –

0

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

मैं या तो है कि regexps में अच्छा नहीं कर रहा हूँ, लेकिन क्या

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

साथ कुछ गड़बड़ है की तरह कुछ ...?

+0

धन्यवाद! यह निश्चित रूप से काम किया। –

संबंधित मुद्दे