2011-11-23 29 views
6

मैं एक सदिश इस तरह के "ZZZ1Z01Z0ZZ0", "1001ZZ0Z00Z0" के रूप में प्रविष्टियों की रचना की है, और इतने पर है, और मैं इस तरह के रूप शर्तों के आधार पर इस सदिश सबसेट को चाहते हैं:स्ट्रिंग वर्ण के आधार पर वेक्टर को कैसे सब्सक्राइब करें?

  1. तीसरे चरित्र एक जेड
  2. है
  3. तीसरे और सातवें वर्ण जेड हैं
  4. तीसरे और सातवें वर्ण जेड कर रहे हैं, और अन्य पात्रों में से कोई भी जेड

मैं चारों ओर strsplit और ग्रेप के साथ खेल की कोशिश की है, लेकिन मैं एक को समझ नहीं सकता पॉसी के आधार पर मेरी स्थितियों को सीमित करने का तरीका स्ट्रिंग पर चरित्र का टयन। कोई सुझाव?

बहुत धन्यवाद!

+1

क्या वैक्टर हमेशा एक ही लंबाई और केवल 0, 1 एस और जेड होगा? मुझे नहीं पता कि यह सामान कैसे काम करता है, मैं केवल इसके लिए एक रेगेक्स दे सकता हूं :) – sinni800

उत्तर

10

आप नियमित अभिव्यक्तियों के साथ ऐसा कर सकते हैं (नियमित अभिव्यक्तियों के विवरण के लिए ?regexp देखें)।

grep मैच का स्थान लौटाता है और यदि कोई मिलान नहीं मिलता है तो शून्य-लंबाई वाले वेक्टर लौटाता है। आप इसके बजाय grepl का उपयोग करना चाह सकते हैं, क्योंकि यह एक लॉजिकल वेक्टर देता है जिसका उपयोग आप सबसेट करने के लिए कर सकते हैं।

z <- c("ZZZ1Z01Z0ZZ0", "1001ZZ0Z00Z0") 
# 3rd character is Z ("^" is start of string, "." is any character) 
grep("^..Z", z) 
# 3rd and 7th characters are Z 
grep("^..Z...Z", z) 
# 3rd and 7th characters are Z, no other characters are Z 
# "[]" defines a "character class" and "^" in a character class negates the match 
# "{n}" repeats the preceding match n times, "+" repeats is one or more times 
grep("^[^Z]{2}Z[^Z]{3}Z[^Z]+", z) 
+0

और आप इसे किसी अन्य तरीके से क्यों मानेंगे? –

+0

आपकी मदद के लिए बहुत बहुत धन्यवाद। मैंने नियमित अभिव्यक्तियों के साथ खेलना शुरू कर दिया है और वे ** कमाल ** हैं! विश्वास नहीं कर सकता कि मैं इससे पहले नहीं फंस गया था। धन्यवाद! –

2

यदि आप चाहें तो विशिष्ट वर्णों को खींचने के लिए आप substr कमांड का उपयोग करके नियमित अभिव्यक्तियों के बिना पहले दो कर सकते हैं।

# Grab the third character in each element and compare it to Z 
substr(z, 3, 3) == "Z" 
# Check if the 3rd and 7th characters are both Z 
(substr(z, 3, 3) == "Z") & (substr(z, 7, 7) == "Z") 

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

3

जोश के जवाब का विस्तार, आप

your_dataset <- data.frame(
    z = c("ZZZ1Z01Z0ZZ0", "1001ZZ0Z00Z0") 
) 
regexes <- c("^..Z", "^..Z...Z", "^[^Z]{2}Z[^Z]{3}Z[^Z]+") 

lapply(regexes, function(rx) 
{ 
    subset(your_dataset, grepl(rx, z)) 
}) 

इसके अलावा str_detect(z, rx) साथ grepl(rx, z) की जगह, stringr पैकेज के उपयोग पर विचार करना चाहते हैं। (थोड़ा अधिक पठनीय कोड को छोड़कर कोई वास्तविक अंतर नहीं है।)

+0

मेरा वोट सबसेट (।, Grepl (।)) सुझाव को पहचानता है। –

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

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