आर में एक स्ट्रिंग से अंतिम एन अक्षर निकालना


271

मैं आर में एक स्ट्रिंग से अंतिम एन अक्षर कैसे प्राप्त कर सकता हूं? एसक्यूएल के अधिकार की तरह एक समारोह है?

जवाबों:


282

मैं आधार आर में कुछ भी के बारे में पता नहीं कर रहा हूँ, लेकिन यह सीधी-सपाट का उपयोग कर यह करने के लिए एक समारोह बनाने के लिए है substrऔर nchar:

x <- "some text in a string"

substrRight <- function(x, n){
  substr(x, nchar(x)-n+1, nchar(x))
}

substrRight(x, 6)
[1] "string"

substrRight(x, 8)
[1] "a string"

जैसा कि @mdsumner बताते हैं, यह सदिश है। विचार करें:

x <- c("some text in a string", "I really need to learn how to count")
substrRight(x, 6)
[1] "string" " count"

1
स्ट्रिंग पैकेज का उपयोग करें। यह
NA

क्या nchar(x)स्थानीय चर को निर्दिष्ट करके दो बार कॉल करने से बचना अधिक कुशल होगा ?
डेव जार्विस

206

यदि आपको stringrपैकेज का उपयोग करने में कोई आपत्ति नहीं है , तो str_subयह आसान है क्योंकि आप पिछड़े की गणना करने के लिए नकारात्मक का उपयोग कर सकते हैं:

x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"

या, जैसा कि मैक्स इस जवाब के लिए एक टिप्पणी में बताते हैं,

str_sub(x, start= -6)
[1] "string"

32
इसके अलावा, str_sub (x, start = -n) को n अंतिम वर्ण मिलते हैं।
मैक्स

2
स्ट्रिंग एनए के मूल्य और सभी एन्कोडिंग के साथ अच्छी तरह से काम नहीं करता है। मैं दृढ़ता से स्ट्राई पैकेज :)
bartektartanus

3
मेरा मानना ​​है कि बैकएंड के रूप में इसका stringrउपयोग किया गया था stringi, इसलिए अब NA आदि के साथ काम करना चाहिए।
m-dz

44

पैकेज stri_subसे फ़ंक्शन का उपयोग करें stringi। अंत से प्रतिस्थापित करने के लिए, नकारात्मक संख्याओं का उपयोग करें। उदाहरणों के लिए नीचे देखें:

stri_sub("abcde",1,3)
[1] "abc"
stri_sub("abcde",1,1)
[1] "a"
stri_sub("abcde",-3,-1)
[1] "cde"

आप इस पैकेज को github: https://github.com/Rexamine/stringi से इंस्टॉल कर सकते हैं

यह अभी CRAN पर उपलब्ध है, बस टाइप करें

install.packages("stringi")

इस पैकेज को स्थापित करने के लिए।



12

एक और यथोचित सीधा तरीका है नियमित भावों का उपयोग करना और sub:

sub('.*(?=.$)', '', string, perl=T)

तो, "एक चरित्र के बाद सब कुछ से छुटकारा पाएं"। अंत में अधिक वर्णों को हथियाने के लिए, लुकहेड एसेरशन में कई डॉट्स जोड़ें:

sub('.*(?=.{2}$)', '', string, perl=T)

जहां का .{2}अर्थ है .., या "कोई भी दो वर्ण", तो इसका अर्थ है "दो वर्णों के बाद आने वाली हर चीज से छुटकारा पाना"।

sub('.*(?=.{3}$)', '', string, perl=T)

तीन वर्णों इत्यादि के लिए, आप वर्णों की संख्या को एक चर के साथ निर्धारित कर सकते हैं, लेकिन आपको pasteचर मान नियमित अभिव्यक्ति स्ट्रिंग में रखना होगा :

n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, perl=T)

2
सभी लुक-अहिदे आदि से बचने के लिए, आप बस कर सकते हैंregmatches(x, regexpr(".{6}$", x))
लेलटेम

10

अद्यतन : जैसा कि mdsumner ने नोट किया है , मूल कोड पहले से ही सदिश है क्योंकि पदार्थ है। अधिक सावधान रहना चाहिए था।

और यदि आप एक वेक्टर संस्करण चाहते हैं ( एंड्री कोड पर आधारित )

substrRight <- function(x, n){
  sapply(x, function(xx)
         substr(xx, (nchar(xx)-n+1), nchar(xx))
         )
}

> substrRight(c("12345","ABCDE"),2)
12345 ABCDE
 "45"  "DE"

ध्यान दें कि मैंने वर्ण प्राप्त (nchar(x)-n)करने के (nchar(x)-n+1)लिए बदल दिया है n


मुझे लगता है कि आपका मतलब है " (nchar(x)-n)से (nchar(x)-n+1)"
जू वांग

8

substring()फ़ंक्शन का उपयोग करके एक सरल आधार आर समाधान (जो जानता था कि यह फ़ंक्शन भी मौजूद है?):

RIGHT = function(x,n){
  substring(x,nchar(x)-n+1)
}

यह मूल रूप से substr()नीचे का लाभ उठाता है, लेकिन इसका डिफ़ॉल्ट अंत मूल्य 1,000,000 है।

उदाहरण:

> RIGHT('Hello World!',2)
[1] "d!"
> RIGHT('Hello World!',8)
[1] "o World!"

6

इसका एक विकल्प substrस्ट्रिंग को एकल वर्णों की सूची में विभाजित करना है और प्रक्रिया है:

N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)

6
मुझे समझ में आ रहा है कि एक system.time () बैटल ब्रूइंग :-)
कार्ल विटथॉफ्ट

4

मैं substrभी उपयोग करता हूं , लेकिन एक अलग तरीके से। मैं "मुझे अपना भोजन दो" के अंतिम 6 अक्षर निकालना चाहते हैं। यहाँ कदम हैं:

(१) पात्रों को विभाजित करें

splits <- strsplit("Give me your food.", split = "")

(२) अंतिम ६ वर्ण निकालें

tail(splits[[1]], n=6)

आउटपुट:

[1] " " "f" "o" "o" "d" "."

प्रत्येक वर्ण तक पहुँचा जा सकता है splits[[1]][x], जहाँ x 1 से 6 है।


3

इससे पहले कि कोई मेरे लिए एक समान समाधान का उपयोग करता है, लेकिन मुझे नीचे के रूप में सोचना आसान है:

> text<-"some text in a string" # we want to have only the last word "string" with 6 letter
> n<-5 #as the last character will be counted with nchar(), here we discount 1
> substr(x=text,start=nchar(text)-n,stop=nchar(text))

यह अंतिम पात्रों को इच्छानुसार लाएगा।


3

इसे इस्तेमाल करे:

x <- "some text in a string"
n <- 5
substr(x, nchar(x)-n, nchar(x))

यह जोर से देना:

[1] "string"

1

मैंने एक स्ट्रिंग के अंतिम वर्ण को प्राप्त करने के लिए निम्नलिखित कोड का उपयोग किया।

    substr(output, nchar(stringOfInterest), nchar(stringOfInterest))

आप अंतिम कुछ वर्ण प्राप्त करने के तरीके का पता लगाने के लिए nchar (stringOfInterest) के साथ खेल सकते हैं।


0

@ कृषि समाधान पर थोड़ा संशोधन भी पूरक देता है:

substrR <- function(x, n) { 
  if(n > 0) substr(x, (nchar(x)-n+1), nchar(x)) else substr(x, 1, (nchar(x)+n))
}
x <- "moSvmC20F.5.rda"
substrR(x,-4)
[1] "moSvmC20F.5"

यही मैं ढूंढ रहा था। और यह बाईं ओर को आमंत्रित करता है:

substrL <- function(x, n){ 
  if(n > 0) substr(x, 1, n) else substr(x, -n+1, nchar(x))
}
substrL(substrR(x,-4),-2)
[1] "SvmC20F.5"

0

अगर पात्रों की एक श्रृंखला को चुनने की आवश्यकता होती है तो बस:

# For example, to get the date part from the string

substrRightRange <- function(x, m, n){substr(x, nchar(x)-m+1, nchar(x)-m+n)}

value <- "REGNDATE:20170526RN" 
substrRightRange(value, 10, 8)

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