आर वेक्टर में प्रत्येक तत्व से अंतिम एन अक्षर कैसे निकालें


106

मैं R के लिए बहुत नया हूं, और मुझे एक सरल उदाहरण नहीं मिल रहा है कि किसी वेक्टर (सरणी) के प्रत्येक तत्व से अंतिम n वर्ण कैसे निकालें?

मैं एक जावा बैकग्राउंड से आता हूं, इसलिए जो मैं करना चाहता हूं वह है कि मैं हर एलिमेंट पर इटर्स्ट करूं a$dataऔर हर एलीमेंट से आखिरी 3 कैरेक्टर्स को हटा दूं।

आप इसके बारे में कैसे जायेंगे?

जवाबों:


115

यहाँ एक उदाहरण है कि मैं क्या करूँगा। मुझे आशा है कि यह वही है जो आप खोज रहे हैं।

char_array = c("foo_bar","bar_foo","apple","beer")
a = data.frame("data"=char_array,"data2"=1:4)
a$data = substr(a$data,1,nchar(a$data)-3)

a a में अब शामिल होना चाहिए:

  data data2
1 foo_ 1
2 bar_ 2
3   ap 3
4    b 4

मजेदार रूप से, मुझे वांछित प्रभाव प्राप्त -3करने के -0लिए बदलना पड़ा! मेरे पास तारीखों के साथ बहुत सारे डेटा हैं, जैसे: "2014-03-27 23:00:00 GMT" "2014-03-31 00:00:00 BST"- हाँ, दो टाइमज़ोन एक साथ, और as.Date फ़ंक्शन अप्रत्याशित परिणाम (BST तिथियों के लिए एक दिन पहले) लौट रहा है - इसलिए मैं टाइमज़ोन स्टैम्प को हटाना चाहता था, मुझे पता है कि मुझे करना होगा करते हैं -0और यह गायब हो जाता है, एक साथ घंटे
LucasSveryvery

स्ट्रैप्टम फ़ंक्शन पर भी विचार करें, मैंने हालांकि टाइमज़ोन का उपयोग नहीं किया है। मुझे लगता है कि यह इसे पहचान सकता है। माना जाता है कि "% Z" समय क्षेत्र को पहचानता है। मैंने नीलम के फंक्शन को भी निकाल दिया। मैं भूल गया कि आर को यह कार्य करना कितना पसंद है।
nfmcclure

@LucasSeveryn यदि आप खाता समय क्षेत्र में लेने के लिए वर्ण समय अभ्यावेदन को तिथियों में बदलना चाहते हैं, तो कृपया इसे अपने प्रश्न में संपादित करें। संभवत: बेहतर उत्तर हैं जो आपको सीधे आपके वांछित परिणामों (जैसे strptime) में प्राप्त करेंगे ।
ब्लू मैस्टर

84

यहाँ एक तरीका है gsub:

cs <- c("foo_bar","bar_foo","apple","beer")
gsub('.{3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"

4
(+1) रेगेक्स का बड़ा प्रशंसक। इसका इस्तेमाल लगभग हर चीज पर किया जा सकता है।
रिच स्क्रीवेन

8
नोट: यह मूल स्ट्रिंग लौटाता है यदि यह लंबा है तो कट करने के लिए वर्णों की संख्या। विचार करें gsub('.{5}$', '', 'abcd')
टॉमस ग्रीफ

32

हालाँकि यह ज्यादातर @nfmcclure के उत्तर के साथ समान है, मैं stringrपैकेज का उपयोग करना पसंद करता हूं क्योंकि यह उन कार्यों का एक सेट साबित करता है जिनके नाम आधार आर की तुलना में सबसे अधिक सुसंगत और वर्णनात्मक हैं (वास्तव में मैं हमेशा के लिए "कैसे प्राप्त करने के लिए Google की संख्या" R में वर्ण " जैसा कि मुझे नाम याद नहीं है nchar())।

library(stringr)
str_sub(iris$Species, end=-4)
#or 
str_sub(iris$Species, 1, str_length(iris$Species)-3)

यह Speciesस्तंभ पर प्रत्येक मान से अंतिम 3 वर्णों को निकालता है ।


22
stringrपैकेज के साथ एक और भी सरल समाधान है: str_sub(iris$Species, end=-4)
जैन-ग्लैक्स

14

वही स्ट्रिंग पैकेज के साथ प्राप्त किया जा सकता है :

library('stringi')
char_array <- c("foo_bar","bar_foo","apple","beer")
a <- data.frame("data"=char_array, "data2"=1:4)
(a$data <- stri_sub(a$data, 1, -4)) # from the first to the last but 4th char
## [1] "foo_" "bar_" "ap"   "b" 

3

@Matthew_Plourde के समान gsub

हालांकि, एक पैटर्न का उपयोग करना जो शून्य वर्णों को ट्रिम कर देगा अर्थात "" यदि मूल स्ट्रिंग को काटने के लिए वर्णों की संख्या से कम है:

cs <- c("foo_bar","bar_foo","apple","beer","so","a")
gsub('.{0,3}$', '', cs)
# [1] "foo_" "bar_" "ap"   "b"    ""    ""

अंतर है, {0,3}क्वांटिफायर 0 से 3 मैचों को इंगित करता है, जबकि इसके {3}लिए ठीक 3 मैचों की आवश्यकता होती है अन्यथा कोई मैच नहीं पाया जाता है, जिस स्थिति gsubमें मूल, अनमॉडल स्ट्रिंग लौटाता है।

एनबी का उपयोग {,3}करने के बराबर होगा {0,3}, मैं बस बाद के अंकन को पसंद करता हूं।

Regex quantifiers के बारे में अधिक जानकारी के लिए यहां देखें: https : // www. अनियमित-expressions.info/refrepeat.html


आप उपयोग कर सकते हैं sub()के बजाय gsub()
sindri_baldur
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.