2013-02-18 11 views
11

मेरे पास एक कीवर्ड (उदा। 'हरा') और कुछ पाठ है ("मुझे उन्हें सैम आई एम पसंद नहीं है!")।आर - एक स्ट्रिंग और दूसरे के अक्षरों के बीच मिलान करें, कोई प्रतिस्थापन

मैं देखना चाहता हूं कि कीवर्ड में कितने वर्ण ('जी', 'आर', 'ई', 'ई', 'एन') टेक्स्ट (किसी भी क्रम में) में होते हैं।

इस उदाहरण में जवाब 3 है - पाठ एक जी या आर नहीं है लेकिन दो Es और एक एन

मेरे समस्या पैदा होती है जहां अगर पाठ में एक चरित्र एक चरित्र के साथ मिलान किया जाता है है कीवर्ड में, तो कीवर्ड में किसी भिन्न वर्ण से मेल खाने के लिए उपयोग नहीं किया जा सकता है।

उदाहरण के लिए, यदि मेरा कीवर्ड 'ग्रीन' था, तो "मिलान करने वाले पात्रों" की संख्या अभी भी 3 (एक एन और दो ईएस) है क्योंकि टेक्स्ट में केवल दो एएस हैं, 3 नहीं (तीसरे ई से मेल खाने के लिए कीवर्ड में)।

मैं इसे आर में कैसे लिख सकता हूं? यह सिर्फ मेरी याददाश्त के किनारे पर कुछ टिक रहा है - मुझे लगता है कि यह एक आम समस्या है, लेकिन सिर्फ अलग-अलग शब्द (जैसे किसी प्रतिस्थापन के साथ नमूनाकरण की तरह, लेकिन "कोई प्रतिस्थापन के साथ मेल नहीं"?)।

उदा।

  • 'ग्रीन', 'idonotlikethemsamiam', 3 (जी, ई, ई)
  • 'greeen:

    keyword <- strsplit('greeen', '')[[1]] 
    text <- strsplit('idonotlikethemsamiam', '')[[1]] 
    # how many characters in keyword have matches in text, 
    # with no replacement? 
    # Attempt 1: sum(keyword %in% text) 
    # PROBLEM: returns 4 (all three Es match, but only two in text) 
    

    अधिक की उम्मीद इनपुट/आउटपुट (कीवर्ड, पाठ, अपेक्षित आउटपुट) के उदाहरण ',' idonotlikethemsamiam ', 3 (जी, ई, ई)

  • ' लाल ',' idonotlikethemsamiam ', 2 (ई और डी)

उत्तर

13

फ़ंक्शन pmatch() इसके लिए बहुत अच्छा है। हालांकि यह लंबाई का उपयोग करने के लिए सहज होगा, लंबाई में कोई na.rm विकल्प नहीं है। तो इस उपद्रव के आसपास काम करने के लिए, योग (! Is.na()) का उपयोग किया जाता है।

keyword <- unlist(strsplit('greeen', '')) 
text <- unlist(strsplit('idonotlikethemsamiam', '')) 

sum(!is.na(pmatch(keyword, text))) 

# [1] 3 

keyword2 <- unlist(strsplit("red", '')) 
sum(!is.na(pmatch(keyword2, text))) 

# [1] 2 
+2

+1: मैंने निश्चित रूप से आज कुछ सीखा है! – Simon

+2

+1, वास्तव में, बहुत slick –

+0

आह! मैंने 'मैच' और 'आकर्षण' की कोशिश करने में उम्र बिताई और ध्यान नहीं दिया कि 'pmatch' ने डुप्लिकेट (बिल्कुल वही जो मैं चाहता था) की अनुमति नहीं दी थी। आपका बहुत बहुत धन्यवाद! –

-1

शायद आप अद्वितीय घटकों को ढूंढने के लिए देख रहे आपके खोजशब्द का? आज़माएं:

keyword <- unique(strsplit('greeen','')[[1]]) 
+0

नहीं, मैं नहीं हूं। मैं पाठ के भीतर होने वाले कीवर्ड में वर्णों की * संख्या * खोजने की कोशिश कर रहा हूं, जहां टेक्स्ट से कोई वर्ण कीवर्ड से मेल खाता है, तो इसका उपयोग कीवर्ड से किसी अन्य चरित्र से मेल खाने के लिए नहीं किया जा सकता है। मेरा वांछित आउटपुट ** संख्यात्मक ** है, वर्णों का वेक्टर नहीं। –

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