Data.table: inclua o %ilike% do PostgreSQL em data.table

Criado em 13 dez. 2017  ·  3Comentários  ·  Fonte: Rdatatable/data.table

Gosto bastante do operador %like% em data.table, pois estou acostumado a consultas SQL. No PostgreSQL existe também a opção ILIKE onde __i__ significa case-__insensitive__.

O que você acha de incluir %ilike% em data.table?

Para incluir isso em data.table, eu criaria um operador %ilike% em ilike.R baseado em like.R adicionando ignore.case = TRUE às chamadas grep() da seguinte forma:

ilike <- function(vector, pattern)
{
  # Intended for use with a data.table 'where'
  # Don't use * or % like SQL's like.  Uses regexpr syntax - more powerful.
  if (is.factor(vector)) {
    as.integer(vector) %in% grep(pattern,levels(vector), ignore.case = TRUE)
  } else {
    # most usually character, but integer and numerics will be silently coerced by grepl
    grepl(pattern,vector, ignore.case = TRUE)
  }
  # returns 'logical' so can be combined with other where clauses.
}

"%ilike%" = ilike

exemplo reproduzível:

require(data.table)
cars = data.table(cars = rownames(mtcars), mtcars)

cars[ cars %like% 'fiat' ] # no case-insensitive search possible
cars[ grep('fiat', cars, ignore.case = TRUE) ] # using comparably long grep
cars[ cars %ilike% 'fiat' ] # the new %ilike%
beginner-task

Comentários muito úteis

Verdade que funciona também, não estava ciente de tal regex. No entanto %ilike% me parece mais intuitivo. Talvez porque eu conheça o PostgreSQL. No geral, esta é uma questão de estilo de codificação de qualquer maneira.

Todos 3 comentários

Você pode usar a tag (?i) :

cars[cars %like% '(?i)fiat']

Verdade que funciona também, não estava ciente de tal regex. No entanto %ilike% me parece mais intuitivo. Talvez porque eu conheça o PostgreSQL. No geral, esta é uma questão de estilo de codificação de qualquer maneira.

@andreasLD obrigado novamente por levantar. Você provavelmente viu desde que comentou lá também, mas observando para o registro que isso foi fechado em #3333 e #3552

Esta página foi útil?
0 / 5 - 0 avaliações