स्ट्रिंग के भीतर विशिष्ट वर्ण बदलें


262

मैं एक वेक्टर के भीतर तारों से विशिष्ट वर्णों को निकालना चाहूंगा, जो कि फाइंड एंड रिप्लेस के समान है एक्सेल में फीचर के ।

यहां वे डेटा हैं जो मैं शुरू करता हूं:

group <- data.frame(c("12357e", "12575e", "197e18", "e18947")

मैं सिर्फ पहले कॉलम से शुरू करता हूं; मैं दूसरे कॉलम को हटाना चाहता हूँ e:

group       group.no.e
12357e      12357
12575e      12575
197e18      19718
e18947      18947

जवाबों:


399

एक नियमित अभिव्यक्ति और समारोह के साथ gsub():

group <- c("12357e", "12575e", "197e18", "e18947")
group
[1] "12357e" "12575e" "197e18" "e18947"

gsub("e", "", group)
[1] "12357" "12575" "19718" "18947"

खाली स्ट्रिंग gsubके "e"साथ प्रत्येक घटना को बदलने के लिए यहां क्या है ""


देखें ?regexpया gsubअधिक मदद के लिए।


15
fixed = TRUEयह तेजी से होगा।
रिच स्क्रिप्न

4
@RichScriven शीघ्र ही आपको बता सकता है कि क्यों?
10

6
fixed=TRUEआर को नियमित अभिव्यक्तियों का उपयोग करने से रोकता है, जो अधिक लचीले पैटर्न के मिलान की अनुमति देता है लेकिन गणना के लिए समय लेता है। यदि सभी की जरूरत है एक एकल निरंतर स्ट्रिंग "ई" को हटा रहा है, वे आवश्यक नहीं हैं।
mm689

चाहेंगे sub("e", "", group)एक ही परिणाम पकड़?
मथियस सैन्टाना

eयह प्रत्येक तत्व में पाए जाने वाले पहले को बदल देगा
sindri_baldur

47

नियमित भाव आपके मित्र हैं:

R> ## also adds missing ')' and sets column name
R> group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))  )
R> group
   group
1 12357e
2 12575e
3 197e18
4 e18947

अब gsub()सबसे सरल संभव प्रतिस्थापन पैटर्न के साथ उपयोग करें : खाली स्ट्रिंग:

R> group$groupNoE <- gsub("e", "", group$group)
R> group
   group groupNoE
1 12357e    12357
2 12575e    12575
3 197e18    19718
4 e18947    18947
R> 

3
इसके अलावा ...require(stringr);group$groupNoE <- str_replace(group$group, "e", "")
डिकोआ

26
खैर, मैं समझ सकता था कि "जो लोग आधार कार्यों को नहीं समझते हैं उन्हें बदलने के लिए बर्बाद किया गया है"। आपके स्रोत फ़ाइल में अंडरस्कोर की संख्या बढ़ाने के अलावा, यहां स्ट्रिंग क्या हासिल करती है?
डिर्क एडल्डबुलेटेल

8
" स्ट्रिंग सरल रैपर्स का एक सेट है जो पैकेज के लेखक से आर के स्ट्रिंग कार्यों को अधिक सुसंगत, सरल और उपयोग करने में आसान बनाता है "। इसलिए यदि आप जो कहते हैं वह सच है (आधार कार्यों को पूरा करने के लिए कई अंडरस्कोर ...) इस पैकेज के मौजूद होने का कोई कारण नहीं है (अस्वीकरण: मैं मुख्य रूप से बेस रेगेक्स कार्यों का उपयोग करता हूं लेकिन मुझे पता है कि वे नए उपयोगकर्ताओं के लिए मुश्किल हो सकते हैं ... )
डिकोआ

17
@ डिकोया: str_replaceलपेटता है sub, इसलिए यह केवल पैटर्न की पहली घटना को बदल देगा। str_replace_allयदि आपको जैसा व्यवहार चाहिए वैसा ही आपको उपयोग करने की आवश्यकता होगी gsub
जोशुआ उलरिच

24

तार को बदलने के लिए 2 तरीके संक्षेप:

group<-data.frame(group=c("12357e", "12575e", "197e18", "e18947"))

1) का उपयोग करें gsub

group$group.no.e <- gsub("e", "", group$group)

2) stringrपैकेज का उपयोग करें

group$group.no.e <- str_replace_all(group$group, "e", "")

दोनों इच्छा उत्पादन होगा:

   group group.no.e
1 12357e      12357
2 12575e      12575
3 197e18      19718
4 e18947      18947

3
जब आपको स्ट्रिंग के लिए वाक्यविन्यास सीखने के लिए टिप्पणियों सहित पूरे पृष्ठ को पढ़ना था, मेरी पसंदीदा विधि, क्योंकि यह ज्यादातर टिप्पणियों में चर्चा की गई थी। यह समाधान जल्दी से दोनों विकल्पों को प्रस्तुत करता है, यही वजह है कि मैंने इसे पेश किया। मेरी उम्मीद अन्य उपयोगकर्ताओं को फ़िल्टर करने में मदद करने की थी जैसे कि मुझे तब करना था जब मैं आर के लिए नया था। मैंने स्ट्रिंग को खोजने से पहले gsub के साथ संघर्ष किया क्योंकि यह एक उच्च उत्तर वाले उत्तर में उल्लेख नहीं किया गया था। फिर, उद्देश्य अपवोट्स इकट्ठा करना नहीं है, बल्कि नए आर उपयोगकर्ताओं की मदद करने का प्रयास करना है।
मेगेट्रॉन

यदि आपको अन्य उत्तर / टिप्पणियों में जानकारी मिलती है, जो आपको उपयोगी लगती हैं और उत्तर में बदलना पसंद करते हैं, तो आप कम से कम यह दिखाने के लिए कुछ अटेंशन प्रदान कर सकते हैं कि आपको यह जानकारी कहां से मिली / जवाब को सिर्फ बनाने के बजाए कॉम्मिन्युटी विकी बना। अपनी खुद की।
डेविड अरेनबर्ग

धन्यवाद - अगली बार के लिए ध्यान में रखेंगे। पहले कभी कोई समुदाय विकी नहीं बनाया है, इसलिए यह नहीं पता था कि यह एक विकल्प था।
मेगेट्रोन

1
विकल्प 2 स्तंभ में सभी मानों को निर्दिष्ट किए बिना, डेटा फ़्रेम में डेटा के स्तंभ पर लागू होने पर बहुत अच्छा काम करता है। स्पष्ट रूप से विकल्प 1 एक दोहराव है, लेकिन विकल्प 2 बहुत अच्छी तरह से काम करता है, और अतिरिक्त कार्यक्षमता के लिए अप-वोट का हकदार है।
Phil_T 18

6

यदि आप इसमें कुछ पात्रों को बदलना चाहते हैं, तो आपको वेक्टर के तार से डेटा फ्रेम बनाने की आवश्यकता नहीं है। नियमित अभिव्यक्ति इसके लिए अच्छा विकल्प है क्योंकि यह पहले ही @Andrie और @Dirk Eddelbuettel द्वारा उल्लेख किया गया है।

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

ctr_names <- c("Czech.Republic","New.Zealand","Great.Britain")
gsub("[.]", " ", ctr_names)

यह उत्पादन करेगा

[1] "Czech Republic" "New Zealand"    "Great Britain" 

आप बस उनसे बच सकते हैं, लेकिन आपको भागने वाले चरित्र से भी बचना होगा क्योंकि यह उद्धरण में है:gsub("\\.", " ", ctr_names)
कामिल एस जेरोन

4

स्ट्रिंग पैकेज का उपयोग करें :

require(stringi)

group<-data.frame(c("12357e", "12575e", "197e18", "e18947"))
stri_replace_all(group[,1], "", fixed="e")
[1] "12357" "12575" "19718" "18947"

0
      library(stringi)

            group <- c('12357e', '12575e', '12575e', ' 197e18',  'e18947')

            pattern <- "e"  
            replacement <-  ""  
            group <- str_replace(group, pattern, replacement)      
            group    

[1] "12357"  "12575"  "12575"  " 19718" "18947" 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.