2013-04-09 15 views
36

में सफेद स्थान से पहले चरित्र स्ट्रिंग को निकालने के लिए मैं जन्मदिन कि कुछ इस तरह दिखाई की एक सूची है: (gsub का उपयोग करते हुए आर

dob <- c("9/9/43 12:00 AM/PM", "9/17/88 12:00 AM/PM", "11/21/48 12:00 AM/PM") 

मैं सिर्फ इस चर से कैलेंडर दिनांक हड़पने के लिए चाहते हैं यानी के बाद सब कुछ छोड़ सफेद अंतरिक्ष की पहली घटना)।

यहाँ क्या मैं अब तक की कोशिश की है:

dob.abridged <- substring(dob,1,8) 
dob 
[1] "9/9/43 1" "9/17/88 " "11/21/48" 
dob.abridged <- gsub(" $","", dob.abridged, perl=T) 
> dob.abridged 
[1] "9/9/43 1" "9/17/88" "11/21/48" 

तो मेरी कोड लंबाई 6 या 7 के कैलेंडर तिथियों के लिए काम करता है, लेकिन लंबाई 8. एक अधिक प्रभावी regex पर कोई संकेत gsub जो कर सकते हैं के साथ उपयोग करने के लिए नहीं लंबाई 6, 7 या 8 की कैलेंडर तिथियों को संभालें?

धन्यवाद।

उत्तर

85

substring के लिए कोई ज़रूरत नहीं, बस gsub का उपयोग करें:

gsub(" .*$", "", dob) 
# [1] "9/9/43" "9/17/88" "11/21/48" 

एक अंतरिक्ष (), तो किसी भी चरित्र (.) स्ट्रिंग ($) के अंत तक कितनी भी बार (*)। नियमित अभिव्यक्तियों को जानने के लिए ?regex देखें।

+2

एकमात्र सलाह जो मैं यहां साझा कर सकता हूं वह यह है कि एक 'उप' पर्याप्त है क्योंकि केवल एक स्ट्रिंग अंत स्थिति है। –

13

मैं अक्सर इस तरह की समस्याओं के लिए strsplit का उपयोग करता हूं लेकिन यह पसंद आया कि रोमैन का जवाब कितना आसान था। मैंने सोचा कि यह एक strsplit जवाब देने के लिए रोमेन के समाधान की तुलना करने के लिए दिलचस्प होगा:

sapply(strsplit(dob, "\\s+"), "[", 1) 

मूल डेटा के साथ microbenchmark पैकेज और dob <- rep(dob, 1000) का उपयोग करना::

Unit: milliseconds 
            expr  min  lq median 
        gsub(" .*$", "", dob) 4.228843 4.247969 4.258232 
sapply(strsplit(dob, "\\\\s+"), "[", 1) 14.438241 14.558832 14.634638 
     uq  max neval 
    4.268029 5.081608 1000 
14.756628 53.344984 1000 

यहाँ एक strsplit समाधान है विन 7 मशीन पर स्पष्ट विजेता रोमन से gsub रेगेक्स है। उत्तर और स्पष्टीकरण रोमेन के लिए धन्यवाद।

1

लाइब्रेरी stringr इस समस्या के अनुरूप एक फ़ंक्शन शामिल है।

library(stringr) 
word(dob,1) 
# [1] "9/9/43" "9/17/88" "11/21/48" 
संबंधित मुद्दे