2014-10-04 14 views
9

Tôi muốn lọc ra các hàng của bảng chứa '*' trong giá trị chuỗi của cột. Chỉ kiểm tra cột đó.Làm thế nào để xác định xem một chuỗi "kết thúc bằng" một chuỗi khác trong R?

string_name = c("aaaaa", "bbbbb", "ccccc", "dddd*", "eee*eee") 

zz <- sapply(tx$variant_full_name, function(x) {substrRight(x, -1) =="*"}) 
Error in FUN(c("Agno I30N", "VP2 E17Q", "VP2 I204*", "VP3 I85F", "VP1 K73R", : 
    could not find function "substrRight" 

Giá trị thứ 4 của zz phải là TRUE theo điều này.

trong python có chức năng endswith cho chuỗi [string_s.endswith ('*')] Có điều gì tương tự như trong R?

Ngoài ra, có phải vấn đề vì '*' là một ký tự vì nó có nghĩa là bất kỳ ký tự nào không? grepl cũng không hoạt động.

> grepl("*^",'dddd*') 
[1] TRUE 
> grepl("*^",'dddd') 
[1] TRUE 
+2

Bạn có thể thoát khỏi '*' 'grepl ("\\ *", 'dddd *') '. Để tìm các chuỗi kết thúc bằng '*', bạn có thể sử dụng 'grepl (" \\ * $ ", string_name)' – jdharrison

Trả lời

8

*quantifier trong cụm từ thông dụng. Nó báo cho công cụ biểu thức chính quy cố gắng khớp với mã thông báo trước "không hoặc nhiều lần". Để khớp với chữ, bạn cần đặt trước dấu gạch ngang với hai dấu gạch chéo ngược hoặc đặt bên trong một lớp ký tự [*]. Để kiểm tra xem chuỗi có kết thúc bằng một mẫu cụ thể hay không, hãy sử dụng end of string $anchor.

> grepl('\\*$', c('aaaaa', 'bbbbb', 'ccccc', 'dddd*', 'eee*eee')) 
# [1] FALSE FALSE FALSE TRUE FALSE 

Bạn chỉ có thể làm điều này mà không cần thực hiện một biểu hiện thường xuyên trong cơ sở R:

> x <- c('aaaaa', 'bbbbb', 'ccccc', 'dddd*', 'eee*eee') 
> substr(x, nchar(x)-1+1, nchar(x)) == '*' 
# [1] FALSE FALSE FALSE TRUE FALSE 
8

Đây là đủ đơn giản mà bạn không cần phải biểu thức thông thường.

> string_name = c("aaaaa", "bbbbb", "ccccc", "dddd*", "eee*eee") 
> substring(string_name, nchar(string_name)) == "*" 
[1] FALSE FALSE FALSE TRUE FALSE 
5

tôi sử dụng một cái gì đó như thế này:

strEndsWith <- function(haystack, needle) 
{ 
    hl <- nchar(haystack) 
    nl <- nchar(needle) 
    if(nl>hl) 
    { 
    return(F) 
    } else 
    { 
    return(substr(haystack, hl-nl+1, hl) == needle) 
    } 
} 
Các vấn đề liên quan