2012-06-04 3 views
8

मैं निम्नलिखित डेटा है:एक चरित्र के बाद आर में एक स्ट्रिंग के अंत कि मौजूद हो सकते हैं छोटा किया जा रहा शून्य या अधिक बार

temp<-c("AIR BAGS:FRONTAL" ,"SERVICE BRAKES HYDRAULIC:ANTILOCK", 
    "PARKING BRAKE:CONVENTIONAL", 
    "SEATS:FRONT ASSEMBLY:POWER ADJUST", 
    "POWER TRAIN:AUTOMATIC TRANSMISSION", 
    "SUSPENSION", 
    "ENGINE AND ENGINE COOLING:ENGINE", 
    "SERVICE BRAKES HYDRAULIC:ANTILOCK", 
    "SUSPENSION:FRONT", 
    "ENGINE AND ENGINE COOLING:ENGINE", 
    "VISIBILITY:WINDSHIELD WIPER/WASHER:LINKAGES") 

मैं एक नया वेक्टर कि पहले केवल पाठ को बरकरार रखे हुए बनाना चाहेंगे पहले ":" उन मामलों में जहां ":" मौजूद है, और पूरा शब्द ":" मौजूद नहीं है।

मैं उपयोग करने के लिए प्रयास किया है:

temp=data.frame(matrix(unlist(str_split(temp,pattern=":",n=2)), 
+      ncol=2, byrow=TRUE)) 

लेकिन यह मामलों में काम नहीं करता है, जहां है वहाँ कोई ":"

मैं जानता हूँ कि इस सवाल का बहुत के समान है: truncate string from a certain character in R है, जो इस्तेमाल किया :

sub("^[^.]*", "", x) 

लेकिन मैं नियमित अभिव्यक्ति साथ बहुत परिचित नहीं हूँ और कि उदाहरण उल्टा करने के लिए केवल strin की शुरुआत बनाए रखने के लिए संघर्ष किया है जी।

उत्तर

15

आप एक साधारण के साथ इस हल कर सकते हैं रेगेक्स:

sub("(.*?):.*", "\\1", x) 
[1] "AIR BAGS"     "SERVICE BRAKES HYDRAULIC" "PARKING BRAKE"    "SEATS"      
[5] "POWER TRAIN"    "SUSPENSION"    "ENGINE AND ENGINE COOLING" "SERVICE BRAKES HYDRAULIC" 
[9] "SUSPENSION"    "ENGINE AND ENGINE COOLING" "VISIBILITY"  

regex कैसे काम करता है: ? साथ इसे संशोधित

कोई भी वर्ण .* के बार-बार सेट के लिए
  • "(.*?):.*" देखो लेकिन लालची नहीं किया जाना है। यह एक पेट और उसके बाद किसी भी चरित्र (दोहराया)
  • स्थानापन्न सा कोष्ठकों के अंदर पाया के साथ पूरे स्ट्रिंग द्वारा पालन किया जाना चाहिए - "\\1"

सा समझने की है कि किसी भी regex मिलान का लालची है। इसे लालची होने के लिए संशोधित करके, पहले पैटर्न मैच में कोलन शामिल नहीं हो सकता है, क्योंकि ब्रांड्स के बाद पहला अक्षर एक कोलन है। कोलन के बाद रेगेक्स डिफ़ॉल्ट पर वापस आ गया है, यानी लालची।

yy <- sub(":.*$", "", yy) 

यदि कोई: कुछ भी नहीं के साथ है और यह और कुछ भी बदलने के बाद यह: ""

+0

इसके लिए धन्यवाद! और regex –

3

इस काम करता है (अपने डेटा संभालने एक चरित्र वेक्टर में है):

x <- c('foobar','foo:bar','foo1:bar1 foo:bar','foo bar') 
> sapply(str_split(x,":"),'[',1) 
[1] "foobar" "foo"  "foo1" "foo bar" 
+0

(+1) लेता है यह जवाब मैं के बारे में सोचा सही स्थान है। गति के संदर्भ में आपको लगता है कि यह रेगेक्स समाधान से तुलना करता है? – Dason

+0

@Dason यह मेरा विचार भी था क्योंकि मैं वास्तव में regex में "सोच" नहीं करता, लेकिन मुझे गति के लिए उच्च उम्मीद नहीं थी। – joran

1

इस मामले

yy<-c("AIR BAGS:FRONTAL", 
"SERVICE BRAKES HYDRAULIC:ANTILOCK", 
"PARKING BRAKE:CONVENTIONAL", 
"SEATS:FRONT ASSEMBLY:POWER ADJUST", 
"POWER TRAIN:AUTOMATIC TRANSMISSION", 
"SUSPENSION", 
"ENGINE AND ENGINE COOLING:ENGINE", 
"SERVICE BRAKES HYDRAULIC:ANTILOCK", 
"SUSPENSION:FRONT", 
"ENGINE AND ENGINE COOLING:ENGINE", 
"VISIBILITY:WINDSHIELD WIPER/WASHER:LINKAGES") 
yy<-gsub("([^:]*).*","\\1",yy) 
yy 

में के लिए काम कर सकते हैं आप

9

एक और दृष्टिकोण पहले देखने के लिए है ":" पाया जाता है तो कुछ भी नहीं दिया जाता है और आप के पूरे मिल मूल स्ट्रिंग यदि कोई ":" है तो पहले व्यक्ति को उसके बाद सब कुछ मिलकर मेल किया जाता है, फिर इसे कुछ भी नहीं ("") से बदल दिया जाता है जो इसे हटा देता है और सब कुछ उस पहले कोलन तक छोड़ देता है।

3

इसे उत्तर के रूप में जोड़ने के लिए खेद है।बार के जवाब में ले लिया:

> yy<-rep("foo1:bar1",times=100000) 
> system.time(yy1<-sapply(strsplit(yy,":"),'[',1)) 
    user system elapsed 
    0.26 0.00 0.27 
> 
> system.time(yy2<-sub("(.*?):.*", "\\1", yy)) 
    user system elapsed 
    0.1  0.0  0.1 
> 
> system.time(yy3 <- sub(":.*$", "", yy)) 
    user system elapsed 
    0.08 0.00 0.07 
> 
> system.time(yy4<-gsub("([^:]*).*","\\1",yy)) 
    user system elapsed 
    0.09 0.00 0.09 

regex लगभग बराबर हैं strsplit थोड़ा अधिक समय

+0

उपयोगी विस्तार की व्याख्या। मैंने यह उत्साहजनक पाया कि मेरे दिमाग में सबसे सरल लगने वाला रेगेक्स, @ ग्रेग्सॉन्स भी सबसे तेज़ था। अन्य दो रेगेक्स समाधान "कक्षा" शुरू करने और अनमोडिफाइड के उपयोग के स्पष्टीकरण के तरीके के रूप में चरित्र वर्गों के उनके चित्रण के लिए जानकारीपूर्ण थे? लालची व्यवहार को दबाने के लिए। –

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

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