2017-01-02 2 views
5

Gibt es eine Möglichkeit, den Operator im Paket datatable so zu schalten, dass die Groß-/Kleinschreibung nicht beachtet wird? So würde zum Beispiel 'hello' %like% 'HELlo' übereinstimmen.So erhalten Sie den Operator% like%, um die Groß-/Kleinschreibung nicht zu berücksichtigen

+1

Sie könnten '% chin%' anstelle von '% like%' verwenden, oder wenn es eine Teilzeichenfolge ist, dann verwenden Sie 'grepl' mit dem Befehl' ignore.case' – akrun

+5

Sie können auch 'tolower':' tolower verwenden a)% wie% tolower (b) ". – nicola

+0

@nicola gute Idee danke – ChiseledAbs

Antwort

6

Durch die nicht in data.table auf der Definition unter Berufung:

`%like%` <- function (x, pattern) { 
    stringi::stri_detect_regex(x, pattern, case_insensitive=TRUE) 
} 

data.table definiert sie als:

function (vector, pattern) 
{ 
    if (is.factor(vector)) { 
     as.integer(vector) %in% grep(pattern, levels(vector)) 
    } 
    else { 
     grepl(pattern, vector) 
    } 
} 

Sie könnten den factor Fall decken, wenn Sie mögen, aber es ist nicht eine sehr komplexe Funktion. Keine "Magie" drin.

Ich benutze stringi so wie es ist (für meine Arbeit) viel robuster als integrierte String-Ops und bietet viel mehr Leistung unter der Haube.

Sie können auch definieren als:

`%like%` <- function (x, pattern) { 
    grepl(pattern, x, ignore.case=TRUE) 
} 

(wieder, ohne auf den factor Fall), wenn Sie möchten. Sie verlieren die vektorisierte pattern dies tun, tho.

Machen Sie den Namen %likeic% (wie, ignorieren Sie Groß- und Kleinschreibung), wenn Sie nicht die Definition für quetschen wollen.

+0

Lektion ist: '% like%' ist eine Komfortfunktion, was bedeutet, dass sie für sehr häufige, aber einfache Situationen entwickelt wurde. Das wirkliche Arbeitstier ist 'grepl', das robustere Eigenschaften hat; und 'stringi' liefert ein noch leistungsfähigeres' grepl' – MichaelChirico

Verwandte Themen