Jawaban:
Saya tidak mengetahui apa pun di basis R, tetapi langsung membuat fungsi untuk melakukan ini menggunakan substr
dan 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"
nchar(x)
dua kali dengan menugaskannya ke variabel lokal?
Jika Anda tidak keberatan menggunakan stringr
paket, str_sub
berguna 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"
stringr
telah dibuat ulang stringi
sebagai backend, jadi harus bekerja dengan NAS dll sekarang.
Gunakan stri_sub
fungsi dari stringi
paket. 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.
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 paste
nilai variabel ke dalam string ekspresi reguler:
n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, perl=T)
regmatches(x, regexpr(".{6}$", x))
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 n
karakter.
(nchar(x)-n)
untuk (nchar(x)-n+1)
"
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!"
Alternatif untuk substr
membagi string menjadi daftar karakter tunggal dan proses itu:
N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
Saya menggunakan substr
juga, 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.
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.
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.
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"