2014-10-04 8 views
9

Voglio filtrare le righe di una tabella che contengono '*' nel valore di stringa della colonna. Controllando solo quella colonna.Come determinare se una stringa "termina con" un'altra stringa in 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" 

Il 4 ° valore di zz dovrebbe essere VERO di questo.

in python esiste una funzione di endswith per stringhe [string_s.endswith ('*')] Esiste qualcosa di simile in R?

Inoltre, il problema è dovuto a "*" come carattere in quanto indica un carattere qualsiasi? grepl anche non funziona.

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

si può sfuggire al * '' 'Grepl ("\\ *", 'dddd *')'. Per trovare stringhe che terminano con un '*' puoi usare 'grepl (" \\ * $ ", nome_stringa)' – jdharrison

risposta

8

* è un quantifier nelle espressioni regolari. Indica al motore delle espressioni regolari di tentare di far corrispondere il token precedente "zero o più volte". Per abbinare un letterale, devi precederlo con due barre rovesciate o inserire all'interno di una classe di caratteri [*]. Per verificare se la stringa termina con uno schema specifico, utilizzare end of string $anchor.

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

Si può semplicemente fare questo senza l'implementazione di un'espressione regolare nella base di R:

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

Questo è abbastanza semplice che non hai bisogno di espressioni regolari.

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

Io uso qualcosa di simile:

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