R'deki bir dizeden son n karakteri ayıklama


271

R'deki bir dizeden son n karakteri nasıl alabilirim? SQL SAĞ gibi bir işlev var mı?

Yanıtlar:


283

R tabanındaki hiçbir şeyin farkında değilim, ancak bunu kullanarak substrve bunu kullanarak bir işlev yapmak basittir 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"

Bu, mdsumner'ın işaret ettiği gibi vectorizedir. Düşünmek:

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

1
Stringi paketini kullan.
NA'lar

nchar(x)Yerel bir değişkene atayarak iki kez çağrı yapmaktan kaçınmak daha verimli olur mu?
Dave Jarvis

206

stringrPaketi kullanmanın sakıncası yoksa str_subkullanışlıdır, çünkü geriye doğru saymak için negatifleri kullanabilirsiniz:

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

Veya Max'in bu cevaba yaptığı bir yorumda belirttiği gibi,

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

32
Ayrıca, str_sub (x, start = -n) n son karakter alır.
Max

2
stringr NA değeri ve tüm kodlama ile iyi çalışmaz. Stringi paketini şiddetle öneriyorum :)
bartektartanus

3
Ben bir arka uç stringrolarak yeniden yapılmış olduğuna inanıyorum stringi, bu yüzden şimdi NA'lar ile çalışması gerekir.
m-dz

44

Paketteki stri_subişlevi kullanın stringi. Alt dizeyi sondan almak için negatif sayılar kullanın. Örnekler için aşağıya bakın:

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

Bu paketi github'dan yükleyebilirsiniz: https://github.com/Rexamine/stringi

Şimdi CRAN'da kullanılabilir, sadece şunu yazın

install.packages("stringi")

Bu paketi yüklemek için.


20
str = 'This is an example'
n = 7
result = substr(str,(nchar(str)+1)-n,nchar(str))
print(result)

> [1] "example"
> 

12

Bir diğer makul yol da düzenli ifadeler kullanmak ve sub:

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

Yani, "her şeyden sonra tek bir karakterden kurtulun". Sonunda daha fazla karakter almak için, ileriye bakın beyanında birçok nokta ekleyin:

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

nerede .{2}araçlar ..böylece anlam veya "herhangi iki karakter", "her şeyi kurtulmak iki karakter tarafından takip".

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

üç karakter, vb. için. Bir değişkenle yakalanacak karakter sayısını ayarlayabilirsiniz, ancak pastedeğişken ifade için normal ifade dizesine girmeniz gerekir :

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

2
Tüm görünümleri vb önlemek için, sadece yapabilirdiregmatches(x, regexpr(".{6}$", x))
thelatemail

10

GÜNCELLEME : mdsumner tarafından belirtildiği gibi , alt kod olduğu için orijinal kod zaten vektörleştirilmiştir. Daha dikkatli olmalıydım.

Ve vektörleştirilmiş bir sürüm istiyorsanız ( Andrie'nin koduna göre)

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"

Ben değişti unutmayın (nchar(x)-n)etmek (nchar(x)-n+1)için nkarakterleri.


Ne demek "düşünmek (nchar(x)-n)için (nchar(x)-n+1)"
Xu Wang

8

substring()Fonksiyonu kullanan basit bir temel R çözümü (bu fonksiyonun var olduğunu kim bilebilirdi?):

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

Bu temelde substr()altta olma avantajından yararlanır, ancak varsayılan bitiş değeri 1.000.000'dir.

Örnekler:

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

6

Alternatifi substr, dizeyi tek bir karakter listesine ayırmak ve aşağıdakileri işlemektir:

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

6
Ben bir system.time () savaş demleme :-)
hissediyorum

4

Ben de kullanıyorum substrama farklı bir şekilde. "Bana yemeğini ver" in son 6 karakterini çıkarmak istiyorum. İşte adımlar:

(1) Karakterleri böl

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

(2) Son 6 karakteri ayıkla

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

Çıktı:

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

Karakterin her birine erişilebilir splits[[1]][x], burada x 1 ila 6'dır.


3

daha önce birisi benim için benzer bir çözüm kullanıyor, ancak aşağıdaki gibi düşünmeyi daha kolay buluyorum:

> 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))

Bu, son karakterleri istediğiniz gibi getirir.


3

Bunu dene:

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

Vermeli:

[1] "string"

1

Bir dize son karakteri almak için aşağıdaki kodu kullandım.

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

Son birkaç karakteri nasıl alacağınızı öğrenmek için nchar (stringOfInterest) ile oynayabilirsiniz.


0

@Andrie çözümü üzerinde küçük bir değişiklik de tamamlayıcıyı verir:

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"

Aradığım şey buydu. Ve sol tarafa davet ediyor:

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

Bir dizi karakterin seçilmesi gerekiyorsa:

# 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"
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.