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?
Odpowiedz
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%
.
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
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
Możesz również użyć 'tolower':' tolower (a)% jak% tolower (b) '. – nicola
@nicola dobry pomysł dzięki – ChiseledAbs