2014-10-04 13 views
9

Chcę odfiltrować wiersze tabeli, które zawierają "*" w wartości ciągu kolumna. Sprawdzam tylko tę kolumnę.Jak ustalić, czy ciąg "kończy się" innym ciągiem w 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" 

Czwarta wartość zz powinna być PRAWDA przez to.

w Pythonie istnieje funkcja ends dla ciągów znaków [string_s.endswith ('*')] Czy jest coś podobnego do tego w R?

Co więcej, czy jest to problem ze względu na znak "*", ponieważ oznacza on jakąś postać? grepl również nie działa.

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

można uciec '*' 'Grepl ("\\ *", 'dddd *')'. Aby znaleźć ciągi zakończone znakiem '*', możesz użyć 'grepl (" \\ * $ ", nazwa_łańcucha)' – jdharrison

Odpowiedz

8

* jest quantifier w wyrażeniach regularnych. Mówi silnikowi wyrażeń regularnych, aby spróbował dopasować poprzedni token "zero lub więcej razy". Aby dopasować literał, musisz poprzedzić go dwoma tylnymi ukośnikami lub umieścić wewnątrz klasy znaków [*]. Aby sprawdzić, czy ciąg kończy się określonym wzorcem, użyj parametru end of string $anchor.

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

Można po prostu zrobić bez wykonawczych wyrażenie regularne w bazie R:

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

Jest to dość proste, że nie trzeba wyrażeń regularnych.

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

używam coś takiego:

strEndsWith <- function(haystack, needle) 
{ 
    hl <- nchar(haystack) 
    nl <- nchar(needle) 
    if(nl>hl) 
    { 
    return(F) 
    } else 
    { 
    return(substr(haystack, hl-nl+1, hl) == needle) 
    } 
} 
Powiązane problemy