Ekstrak n karakter terakhir dari string di R

271

Bagaimana saya bisa mendapatkan n karakter terakhir dari string dalam R? Apakah ada fungsi seperti SQL's RIGHT?

Brani
sumber

Jawaban:

283

Saya tidak mengetahui apa pun di basis R, tetapi langsung membuat fungsi untuk melakukan ini menggunakan substrdan 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"

Ini di-vectorised, seperti yang ditunjukkan oleh @mdsumner. Mempertimbangkan:

x <- c("some text in a string", "I really need to learn how to count")
substrRight(x, 6)
[1] "string" " count"
Andrie
sumber
1
Gunakan paket stringi. Ini berfungsi baik dengan NAS dan semua penyandian :)
bartektartanus
Apakah lebih efisien untuk menghindari panggilan nchar(x)dua kali dengan menugaskannya ke variabel lokal?
Dave Jarvis
206

Jika Anda tidak keberatan menggunakan stringrpaket, str_subberguna karena Anda dapat menggunakan negatif untuk menghitung mundur:

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

Atau, seperti yang Max tunjukkan dalam komentar untuk jawaban ini,

str_sub(x, start= -6)
[1] "string"
Xu Wang
sumber
32
juga, str_sub (x, start = -n) mendapat n karakter terakhir.
Maks
2
stringr tidak bekerja dengan baik dengan nilai NA dan semua penyandian. Saya sangat merekomendasikan paket stringi :)
bartektartanus
3
Saya percaya stringrtelah dibuat ulang stringisebagai backend, jadi harus bekerja dengan NAS dll sekarang.
m-dz
44

Gunakan stri_subfungsi dari stringipaket. Untuk mendapatkan substring dari akhir, gunakan angka negatif. Lihat contoh di bawah ini:

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

Anda dapat menginstal paket ini dari github: https://github.com/Rexamine/stringi

Ini tersedia di CRAN sekarang, cukup ketik

install.packages("stringi")

untuk menginstal paket ini.

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

> [1] "example"
> 
Andrew
sumber
12

Cara lain yang cukup mudah adalah dengan menggunakan ekspresi reguler dan sub:

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

Jadi, "singkirkan semuanya diikuti oleh satu karakter". Untuk mengambil lebih banyak karakter dari akhir, tambahkan namun banyak titik di pernyataan lookahead:

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

di mana .{2}berarti .., atau "setiap dua karakter", jadi artinya "singkirkan semuanya diikuti oleh dua karakter".

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

untuk tiga karakter, dll. Anda dapat mengatur jumlah karakter untuk diambil dengan variabel, tetapi Anda harus pastenilai variabel ke dalam string ekspresi reguler:

n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, perl=T)
dsb
sumber
2
Untuk menghindari semua pandangan-depan dll, Anda bisa melakukannyaregmatches(x, regexpr(".{6}$", x))
thelatemail
10

UPDATE : seperti dicatat oleh mdsumner , kode asli sudah di-vectorised karena substr adalah. Seharusnya lebih hati-hati.

Dan jika Anda menginginkan versi vektor (berdasarkan kode Andrie )

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"

Perhatikan bahwa saya telah berubah (nchar(x)-n)untuk (nchar(x)-n+1)mendapatkan nkarakter.

Laurent
sumber
Saya pikir Anda bermaksud " (nchar(x)-n)untuk (nchar(x)-n+1)"
Xu Wang
8

Solusi dasar R sederhana menggunakan substring()fungsi (siapa yang tahu fungsi ini bahkan ada?):

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

Ini pada dasarnya mengambil keuntungan di substr()bawah tetapi memiliki nilai akhir default 1.000.000.

Contoh:

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

Alternatif untuk substrmembagi string menjadi daftar karakter tunggal dan proses itu:

N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
mdsumner
sumber
6
Saya merasakan system.time () pertempuran pembuatan bir :-)
Carl Witthoft
4

Saya menggunakan substrjuga, tetapi dengan cara yang berbeda. Saya ingin mengekstrak 6 karakter terakhir dari "Beri saya makanan Anda." Berikut langkah-langkahnya:

(1) Membagi karakter

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

(2) Ekstrak 6 karakter terakhir

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

Keluaran:

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

Setiap karakter dapat diakses oleh splits[[1]][x], di mana x adalah 1 hingga 6.

remykarem
sumber
3

seseorang sebelum menggunakan solusi serupa dengan saya, tetapi saya merasa lebih mudah untuk berpikir seperti di bawah ini:

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

Ini akan membawa karakter terakhir seperti yang diinginkan.

JP Fonseca
sumber
3

Coba ini:

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

Harus memberi:

[1] "string"
lukasz
sumber
1

Saya menggunakan kode berikut untuk mendapatkan karakter terakhir dari sebuah string.

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

Anda dapat bermain dengan nchar (stringOfInterest) untuk mengetahui cara mendapatkan beberapa karakter terakhir.

Anurag Mishra
sumber
0

Sedikit modifikasi pada solusi @Andrie juga memberikan pelengkap:

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"

Itulah yang saya cari. Dan itu mengundang ke sisi kiri:

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"
xm1
sumber
0

Untuk jaga-jaga jika berbagai karakter perlu dipilih:

# 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"
Ranonkahn
sumber