Trích xuất n ký tự cuối cùng từ một chuỗi trong R


271

Làm thế nào tôi có thể nhận được n ký tự cuối cùng từ một chuỗi trong R? Có một chức năng như QUYỀN của SQL không?

Câu trả lời:


280

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 substrnchar:

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"

1
Sử dụng gói Stringi. Nó hoạt động tốt với NA và tất cả mã hóa :)
bartektartanus

Sẽ hiệu quả hơn nếu tránh gọi nchar(x)hai lần bằng cách gán nó cho một biến cục bộ?
Dave Jarvis

206

Nếu bạn không phiền khi sử dụng stringrgói, str_subrấ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"

32
Ngoài ra, str_sub (x, start = -n) có n ký tự cuối cùng.
Tối đa

2
Stringr không hoạt động tốt với giá trị của NA và tất cả mã hóa. Tôi đặc biệt giới thiệu gói Stringi :)
bartektartanus

3
Tôi tin rằng stringrđã được làm lại bằng cách sử dụng stringinhư một phụ trợ, vì vậy nên làm việc với NA, v.v.
m-dz

44

Sử dụng stri_subchức năng từ stringigó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.


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

> [1] "example"
> 

12

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 pastegiá trị biến vào chuỗi biểu thức chính quy:

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

2
Để tránh tất cả các giao diện, v.v., bạn chỉ có thể làmregmatches(x, regexpr(".{6}$", x))
thelHRail

10

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 nnhân vật.


Tôi nghĩ bạn có nghĩa là " (nchar(x)-n)đến (nchar(x)-n+1)"
Xu Wang

8

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!"

6

Một cách khác substrlà 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)

6
Tôi cảm nhận được một pha chế system.time () :-)
Carl Witthoft

4

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.


3

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.


3

Thử cái này:

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

Nó sẽ đưa ra:

[1] "string"

1

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.


0

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"

0

Chỉ trong trường hợp nếu một loạt các ký tự cần được chọn:

# 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"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.