2017-01-02 8 views
5

Czy istnieje sposób, aby zmienić operatora %like% w pakiecie datatable, aby wielkość liter była niewrażliwa? Na przykład pasuje 'hello' %like% 'HELlo'.Jak ustawić operator% like% na wielkość liter?

+1

Możesz użyć '% chin%' zamiast '% like%' lub jeśli jest to podłańcuch, wtedy użyj 'grepl' który ma' ignore.case' command – akrun

+5

Możesz również użyć 'tolower':' tolower (a)% jak% tolower (b) '. – nicola

+0

@nicola dobry pomysł dzięki – ChiseledAbs

Odpowiedz

6

By nie opierając się na definicji w data.table:

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

data.table definiuje ją jako:

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

Można objąć sprawę factor, jeśli chcesz, ale nie jest to bardzo skomplikowana czynność. Nie ma w tym "magii".

Używam stringi jak to jest (dla mojej pracy) o wiele bardziej niezawodne niż wbudowane ciągi ops i zapewnia znacznie więcej mocy pod maską.

Można również zdefiniować jako:

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

(ponownie, ignorując sprawę factor), jeśli chcesz. Tracisz wektoryzowany pattern robiąc to, tho.

Wpisz nazwę %likeic% (np., Ignoruj ​​wielkość liter), jeśli nie chcesz zgnieść definicji dla data.table 's %like%.

+0

Lekcja: '% like%' jest funkcją wygody, co oznacza, że ​​została zaprojektowana do bardzo typowych, ale prostych sytuacji. Prawdziwym koniem roboczym jest 'grepl', który ma bardziej niezawodne funkcje; a 'stringi' zapewnia jeszcze potężniejsze' grepl' – MichaelChirico