स्ट्रिंग का पहला वर्ण प्राप्त करना और निकालना


102

मैं प्रत्येक वर्ण के लिए अलग-अलग मान निर्दिष्ट करके वर्णों के तारों का उपयोग करके कुछ 2-आयामी चलना चाहता हूं। मैं एक स्ट्रिंग के पहले चरित्र को 'पॉप' करने की योजना बना रहा था, इसका उपयोग करता हूं, और बाकी स्ट्रिंग के लिए दोहराता हूं।

मैं इस तरह से कुछ कैसे हासिल कर सकता हूं?

x <- 'hello stackoverflow'

मैं ऐसा कुछ करने में सक्षम होना चाहता हूं:

a <- x.pop[1]

print(a)

'h'
print(x)

'ello stackoverflow'

जवाबों:


167

देख लो ?substring

x <- 'hello stackoverflow'
substring(x, 1, 1)
## [1] "h"
substring(x, 2)
## [1] "ello stackoverflow"

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

PopStringFactory <- setRefClass(
  "PopString",
  fields = list(
    x = "character"  
  ),
  methods = list(
    initialize = function(x)
    {
      x <<- x
    },
    pop = function(n = 1)
    {
      if(nchar(x) == 0)
      {
        warning("Nothing to pop.")
        return("")
      }
      first <- substring(x, 1, n)
      x <<- substring(x, n + 1)
      first
    }
  )
)

x <- PopStringFactory$new("hello stackoverflow")
x
## Reference class object of class "PopString"
## Field "x":
## [1] "hello stackoverflow"
replicate(nchar(x$x), x$pop())
## [1] "h" "e" "l" "l" "o" " " "s" "t" "a" "c" "k" "o" "v" "e" "r" "f" "l" "o" "w"


10

stringiपैकेज से इस फ़ंक्शन का उपयोग करें

> x <- 'hello stackoverflow'
> stri_sub(x,2)
[1] "ello stackoverflow"

8

substringनिश्चित रूप से सबसे अच्छा है, लेकिन यहाँ एक strsplitविकल्प है, क्योंकि मैंने अभी तक एक नहीं देखा है।

> x <- 'hello stackoverflow'
> strsplit(x, '')[[1]][1]
## [1] "h"

या समकक्ष

> unlist(strsplit(x, ''))[1]
## [1] "h"

और आप pasteबाकी स्ट्रिंग को एक साथ वापस कर सकते हैं।

> paste0(strsplit(x, '')[[1]][-1], collapse = '')
## [1] "ello stackoverflow"

5

पहले वर्णों को हटाना:

x <- 'hello stackoverflow'
substring(x, 2, nchar(x))

आइडिया 2 से शुरू होने वाले सभी वर्णों का चयन करता है जो x में वर्णों की संख्या है। यह महत्वपूर्ण है जब आपके पास शब्द या वाक्यांश में वर्णों की असमान संख्या हो।

पहले पत्र का चयन पिछले उत्तरों के रूप में तुच्छ है:

substring(x,1,1)

2

एक अन्य विकल्प नियमित अभिव्यक्ति कार्यों के साथ उप-अभिव्यक्तियों का उपयोग करना है regmatchesऔर regexec

# the original example
x <- 'hello stackoverflow'

# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', x))

यह संपूर्ण स्ट्रिंग, पहला वर्ण, और "popped" परिणाम की लंबाई 1 की सूची में देता है।

myStrings
[[1]]
[1] "hello stackoverflow" "h"                   "ello stackoverflow" 

जो के बराबर है list(c(x, substr(x, 1, 1), substr(x, 2, nchar(x))))। यही है, इसमें वांछित तत्वों के साथ-साथ पूर्ण स्ट्रिंग का सुपर सेट शामिल है।


जोड़ना sapplyइस विधि को लंबाई के वर्ण वेक्टर> 1 के लिए काम करने की अनुमति देगा।

# a slightly more interesting example
xx <- c('hello stackoverflow', 'right back', 'at yah')

# grab the substrings
myStrings <- regmatches(x, regexec('(^.)(.*)', xx))

यह पहले तत्व के रूप में मिलान किए गए पूर्ण स्ट्रिंग के साथ एक सूची देता है और ()निम्नलिखित तत्वों के रूप में कैप्चर किए गए मिलान सबटेक्शंस । इसलिए नियमित अभिव्यक्ति में '(^.)(.*)', (^.)पहले चरित्र से (.*)मेल खाता है और शेष पात्रों से मेल खाता है।

myStrings
[[1]]
[1] "hello stackoverflow" "h"                   "ello stackoverflow" 

[[2]]
[1] "right back" "r"          "ight back" 

[[3]]
[1] "at yah" "a"      "t yah" 

अब, हम वांछित सबस्ट्रिंग को बाहर निकालने के लिए भरोसेमंद sapply+ [विधि का उपयोग कर सकते हैं ।

myFirstStrings <- sapply(myStrings, "[", 2)
myFirstStrings
[1] "h" "r" "a"
mySecondStrings <- sapply(myStrings, "[", 3)
mySecondStrings
[1] "ello stackoverflow" "ight back"          "t yah"

यह एक बहुत अच्छी चाल है लेकिन मुझे लगता है कि सवाल याद आता है।
पडोसौरियो

आपको आगे की व्याख्या करने की आवश्यकता होगी क्योंकि यह अन्य उत्तरों के समान उत्पादन कर सकता है। कोड का अंतिम ब्लॉक देखें जो sapplyनिष्कर्षण के लिए उपयोग करता है । पहले चरित्र को "पॉपिंग" करना, जैसा कि प्रश्न में निर्दिष्ट है, इस प्रक्रिया को परिणामी वेक्टर (mySecondStrings) पर दोहराने की बात है।
लोमो

सुनिश्चित करें कि यह आपके द्वारा जोड़े गए अतिरिक्त विवरण के साथ काम करता है लेकिन मुझे अभी भी इसे जितना समझा जाना चाहिए उससे अधिक जटिल लगता है।
पेड्रोसोरियो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.