आर

2015-06-04 4 views
6

का उपयोग कर स्ट्रिंग में विशिष्ट अक्षरों के लगातार होने वाले खंड की पहचान करें, मैं यह पहचानना चाहता हूं कि नीचे दिए गए डेटा फ्रेम में स्ट्रिंग कॉलम "वी" या "जी" अक्षरों को पहले 20 वर्णों में कम से कम 5 बार दोहराता है या नहीं स्ट्रिंग।आर

नमूना डेटा:

data = data.frame(class = c('a','b','C'), string = 
c("ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ", 
"AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD", 
"GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER")) 

उदाहरण के लिए पहली पंक्ति में स्ट्रिंग पहले 20 चरित्र पदों के भीतर "VVVVG" है। इसी प्रकार तीसरी पंक्ति में स्ट्रिंग में "वीवीजीजीवी" है।

data 
# class             string 
#1  a ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ 
#2  b  AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD 
#3  C  GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER 

वांछित आउटपुट इस तरह दिखना चाहिए:

# class             string result 
# 1  a ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ TRUE 
# 2  b  AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD FALSE 
# 3  C  GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER TRUE 
+2

शायद 'डेटा $ परिणाम <- grepl ('(वी | जी) {5,}', substr (डेटा $ स्ट्रिंग, 1,20))' – akrun

+0

धन्यवाद @akrun यह ठीक काम करता है –

+0

क्या होगा यदि पहले 20 वर्ण – akrun

उत्तर

5

इसी प्रकार के Akrun के

transform(data, result=grepl("[VG]{5,}", substr(string, 1, 20))) 

उत्पादन

class             string result 
1  a ASADSASAVVVVGVGGGSDASSSDDDFGDFGHFGHFGGGGGDDFFDDFGDFGTYJ TRUE 
2  b  AWEERTGVTHRGEFGDFSDFSGGGGGGDAWSDFAASDADAADWERWEQWD FALSE 
3  C  GRTVVGGVVVGGSWERGERVGEGDDFASDGGVQWEQWEQWERERYRYER TRUE 

यहाँ हम grep का प्रयोग कर एक चरित्र वर्ग के साथ संयुक्त है कि माचिस या तो "जी" या "वी" ([VG]) 5 या अधिक बार दोहराया ({5, })। transform या तो जोड़े गए या संशोधित कॉलम के साथ एक नया डेटा फ्रेम बनाता है।


संपादित करें: महेश का रचनात्मक जवाब के खिलाफ कुछ मानक:

set.seed(1) 
string <- vapply(
    replicate(1e5, sample(c("V", "G", "A", "S"), sample(20:300, 1), rep=T)), 
    paste0, character(1L), collapse="" 
) 
library(microbenchmark) 
microbenchmark(
    grepl("[VG]{5,}", substr(string, 1, 20)), 
    grepl("^.{,15}[VG]{5,}", string), 
    times=10 
) 

का उत्पादन:

Unit: milliseconds 
            expr  min  lq  mean 
grepl("[VG]{5,}", substr(string, 1, 20)) 131.6668 131.8343 133.6644 
     grepl("^.{,15}[VG]{5,}", string) 299.7326 300.4416 302.5065 

पूरी तरह से यकीन है कि क्या उम्मीद करने के लिए नहीं था, लेकिन मुझे लगता है कि यह समझ में आता है के बाद से substr है आवेदन करने के लिए बहुत आसान है। स्ट्रिंग के सामने के पास पैटर्न दोहराए जाने पर टाइम्स बहुत करीब हैं।

+0

बेंचमार्क के लिए धन्यवाद, बहुत उपयोगी है। –

4

एक अन्य विकल्प, substr बिना:

within(data, result<-grepl('^.{,15}[VG]{5,}', string)) 
+1

अच्छा विकल्प – BrodieG

+1

बहुत अच्छा विकल्प। – akrun