Câu trả lời:
Tôi không biết bất cứ điều gì trong cơ sở R, nhưng thật đơn giản để tạo ra một chức năng để làm điều này bằng cách sử dụng substr
và 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"
Đây là véc tơ, như @mdsumner chỉ ra. Xem xét:
x <- c("some text in a string", "I really need to learn how to count")
substrRight(x, 6)
[1] "string" " count"
nchar(x)
hai lần bằng cách gán nó cho một biến cục bộ?
Nếu bạn không phiền khi sử dụng stringr
gói, str_sub
rất tiện lợi vì bạn có thể sử dụng tiêu cực để đếm ngược:
x <- "some text in a string"
str_sub(x,-6,-1)
[1] "string"
Hoặc, như Max chỉ ra trong một nhận xét cho câu trả lời này,
str_sub(x, start= -6)
[1] "string"
stringr
đã được làm lại bằng cách sử dụng stringi
như một phụ trợ, vì vậy nên làm việc với NA, v.v.
Sử dụng stri_sub
chức năng từ stringi
gói. Để có được chuỗi con từ cuối, sử dụng số âm. Nhìn bên dưới để biết ví dụ:
stri_sub("abcde",1,3)
[1] "abc"
stri_sub("abcde",1,1)
[1] "a"
stri_sub("abcde",-3,-1)
[1] "cde"
Bạn có thể cài đặt gói này từ github: https://github.com/Rexamine/opesi
Nó có sẵn trên CRAN bây giờ, chỉ cần gõ
install.packages("stringi")
để cài đặt gói này.
Một cách hợp lý đơn giản khác là sử dụng các biểu thức thông thường và sub
:
sub('.*(?=.$)', '', string, perl=T)
Vì vậy, "loại bỏ mọi thứ theo sau bởi một nhân vật". Để lấy thêm ký tự ở cuối, hãy thêm tuy nhiên nhiều dấu chấm trong xác nhận giao diện:
sub('.*(?=.{2}$)', '', string, perl=T)
trong đó .{2}
có nghĩa là ..
, hoặc "bất kỳ hai ký tự", có nghĩa là "loại bỏ mọi thứ theo sau bởi hai ký tự".
sub('.*(?=.{3}$)', '', string, perl=T)
cho ba ký tự, v.v. Bạn có thể đặt số lượng ký tự cần lấy bằng một biến, nhưng bạn sẽ phải đặt paste
giá trị biến vào chuỗi biểu thức chính quy:
n = 3
sub(paste('.+(?=.{', n, '})', sep=''), '', string, perl=T)
regmatches(x, regexpr(".{6}$", x))
CẬP NHẬT : như được lưu ý bởi mdsumner , mã ban đầu đã được véc tơ vì chất nền là. Nên đã cẩn thận hơn.
Và nếu bạn muốn có một phiên bản véc tơ (dựa trên mã của 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"
Lưu ý rằng tôi đã thay đổi (nchar(x)-n)
để (nchar(x)-n+1)
có được n
nhân vật.
(nchar(x)-n)
đến (nchar(x)-n+1)
"
Một giải pháp cơ sở R đơn giản sử dụng substring()
hàm (ai biết hàm này thậm chí còn tồn tại?):
RIGHT = function(x,n){
substring(x,nchar(x)-n+1)
}
Điều này tận dụng cơ bản là substr()
bên dưới nhưng có giá trị cuối mặc định là 1.000.000.
Ví dụ:
> RIGHT('Hello World!',2)
[1] "d!"
> RIGHT('Hello World!',8)
[1] "o World!"
Một cách khác substr
là chia chuỗi thành một danh sách các ký tự đơn và xử lý:
N <- 2
sapply(strsplit(x, ""), function(x, n) paste(tail(x, n), collapse = ""), N)
Tôi cũng sử dụng substr
, nhưng theo một cách khác. Tôi muốn trích xuất 6 ký tự cuối cùng của "Đưa cho tôi thức ăn của bạn." Dưới đây là các bước:
(1) Tách các ký tự
splits <- strsplit("Give me your food.", split = "")
(2) Trích xuất 6 ký tự cuối cùng
tail(splits[[1]], n=6)
Đầu ra:
[1] " " "f" "o" "o" "d" "."
Mỗi ký tự có thể được truy cập bởi splits[[1]][x]
, trong đó x là 1 đến 6.
ai đó trước đây sử dụng một giải pháp tương tự với tôi, nhưng tôi thấy dễ dàng hơn khi nghĩ như sau:
> 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))
Điều này sẽ mang lại các nhân vật cuối cùng như mong muốn.
Tôi đã sử dụng đoạn mã sau để lấy ký tự cuối cùng của chuỗi.
substr(output, nchar(stringOfInterest), nchar(stringOfInterest))
Bạn có thể chơi với nchar (stringOfInterest) để tìm ra cách lấy vài ký tự cuối cùng.
Một sửa đổi nhỏ trên giải pháp @Andrie cũng cung cấp phần bổ sung:
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"
Đó là những gì tôi đang tìm kiếm. Và nó mời sang bên trái:
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"