एक स्ट्रिंग का हिस्सा निकालें


90

मैं एक स्ट्रिंग का हिस्सा कैसे निकालूं? उदाहरण के लिए ATGAS_1121मैं पहले सब कुछ निकालना चाहता हूं _

जवाबों:


131

नियमित अभिव्यक्ति का उपयोग करें। इस मामले में, आप उपयोग कर सकते हैं gsub:

gsub("^.*?_","_","ATGAS_1121")
[1] "_1121"

यह नियमित अभिव्यक्ति स्ट्रिंग (^), किसी भी वर्ण () को शून्य या अधिक बार (*), और अंडरस्कोर (_) की शुरुआत से मेल खाती है। ? मैच को "आलसी" बनाता है ताकि यह केवल पहले अंडरस्कोर के रूप में मैच हो। उस मैच को सिर्फ अंडरस्कोर से बदल दिया जाता है। ?regexअधिक विवरण और संदर्भ के लिए देखें


6
पिछला रेगेक्स, उदाहरण के लिए, पिछले अंडरस्कोर से मेल खाएगा gsub("^.*_","_","ATGAS_1121_xxx")। अब तय हो गया।
रिची कॉटन

7
@ जोशुआ मुझे यह वास्तव में उपयोगी लगता है कि आपने नियमित अभिव्यक्तियों की भूमिका को समझाया।
Vasile

यह अंतिम तर्क के रूप में स्ट्रिंग के वेक्टर के साथ भी काम करता है। आर कमाल है।
n

37

आप उपयोग कर सकते हैं एक अंतर्निहित इस के लिए, strsplit :

> s = "TGAS_1121"
> s1 = unlist(strsplit(s, split='_', fixed=TRUE))[2]
> s1    
 [1] "1121"

strsplit सूची के रूप में विभाजित पैरामीटर पर पार्स किए गए स्ट्रिंग के दोनों टुकड़ों को लौटाता है । शायद यह नहीं है कि आप क्या चाहते हैं, इसलिए कॉल को अनलिस्ट में लपेटें , फिर उस सरणी को अनुक्रमित करें ताकि वेक्टर में दो तत्वों में से केवल दूसरा वापस आ जाए।

अंत में, यह निर्धारित करने के लिए निर्धारित पैरामीटर को TRUE पर सेट किया जाना चाहिए कि विभाजित पैरामीटर एक नियमित अभिव्यक्ति नहीं है, बल्कि एक शाब्दिक मिलान चरित्र है।


23

यदि आप एक स्पष्ट व्यक्ति हैं, तो यहाँ एक कठोर समाधान है:

R> library(stringr)
R> strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
R> strings %>% str_replace(".*_", "_")
[1] "_1121" "_1432" "_1121"
# Or:
R> strings %>% str_replace("^[A-Z]*", "")
[1] "_1121" "_1432" "_1121"

21

यहाँ एक वेक्टर है strsplitतो sइसका समाधान है:

> s <- c("TGAS_1121", "MGAS_1432")
> s1 <- sapply(strsplit(s, split='_', fixed=TRUE), function(x) (x[2]))
> s1
[1] "1121" "1432"

2
बहुत मददगार, धन्यवाद! FYI करें स्ट्रिंग का पहला भाग पाने के लिए (यानी '_' से पहले), [2] को अंत में [1] से बदलें।
स्टीवनजॉ

4

शायद सबसे सहज समाधान शायद stringrफ़ंक्शन का उपयोग करना है str_removeजो इससे भी आसान है str_replaceक्योंकि इसमें 2 के बजाय केवल 1 तर्क है।

आपके उदाहरण में एकमात्र मुश्किल हिस्सा यह है कि आप अंडरस्कोर रखना चाहते हैं, लेकिन इसके संभावित: आपको नियमित अभिव्यक्ति से मेल खाना चाहिए जब तक कि यह निर्दिष्ट स्ट्रिंग पैटर्न नहीं पाता है (?=pattern)

उदाहरण देखें:

strings = c("TGAS_1121", "MGAS_1432", "ATGAS_1121")
strings %>% stringr::str_remove(".+?(?=_)")

[1] "_1121" "_1432" "_1121"

3

यहां पैकेज strsplitका उपयोग करके डेटाफ़्रेम का समाधानdplyr

col1 = c("TGAS_1121", "MGAS_1432", "ATGAS_1121") 
col2 = c("T", "M", "A") 
df = data.frame(col1, col2)
df
        col1 col2
1  TGAS_1121    T
2  MGAS_1432    M
3 ATGAS_1121    A

df<-mutate(df,col1=as.character(col1))
df2<-mutate(df,col1=sapply(strsplit(df$col1, split='_', fixed=TRUE),function(x) (x[2])))
df2

  col1 col2
1 1121    T
2 1432    M
3 1121    A
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.