2014-10-04 5 views
9

Ich möchte die Zeilen einer Tabelle ausfiltern, die '*' im String-Wert der Spalte enthalten. Nur diese Spalte überprüfen.Wie kann man feststellen, ob eine Zeichenkette mit einer anderen Zeichenkette in R endet?

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" 

Der 4. Wert von zz sollte TRUE sein.

In Python gibt es endswith Funktion für Strings [string_s.endswith ('*')] Gibt es etwas ähnliches in R?

Auch, ist es ein Problem wegen '*' als ein Zeichen wie es irgendein Zeichen bedeutet? Grepl funktioniert auch nicht.

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

Sie können entkommen den '*' 'Grepl ("\\ *", 'dddd *')'. Um Strings zu finden, die mit einem '*' enden, können Sie 'grepl (" \\ * $ ", string_name)' verwenden – jdharrison

Antwort

8

* ist ein quantifier in regulären Ausdrücken. Es teilt der Engine für reguläre Ausdrücke mit, das vorherige Token "null oder mehrmals" zu finden. Um einem Literal zu entsprechen, müssen Sie ihm zwei Backslashes voranstellen oder es in eine Zeichenklasse einfügen: [*]. Um zu überprüfen, ob die Zeichenfolge mit einem bestimmten Muster endet, verwenden Sie die end of string $anchor.

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

Sie können einfach das tun, ohne einen regulären Ausdruck in der Basis R Umsetzung:

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

Das ist einfach genug, dass Sie keine regulären Ausdrücke brauchen.

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

ich so etwas wie dieses:

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