Data.table: inclure %ilike% de PostgreSQL dans data.table

Créé le 13 déc. 2017  ·  3Commentaires  ·  Source: Rdatatable/data.table

J'aime beaucoup l'opérateur %like% dans data.table car je suis habitué aux requêtes SQL. Dans PostgreSQL, il existe également l'option ILIKE où __i__ signifie case-__insensible__.

Que pensez-vous de l'inclusion de %ilike% dans data.table ?

Pour l'inclure dans data.table, je créerais un opérateur %ilike% dans ilike.R basé sur like.R en ajoutant ignore.case = TRUE aux appels grep() comme suit :

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

exemple reproductible :

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

Commentaire le plus utile

Certes, cela fonctionne aussi, je n'étais pas au courant d'une telle expression régulière. Néanmoins %ilike% me semble plus intuitif. Peut-être parce que je connais PostgreSQL. Dans l'ensemble, c'est une question de style de codage de toute façon.

Tous les 3 commentaires

Vous pouvez utiliser la balise (?i) la place :

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

Certes, cela fonctionne aussi, je n'étais pas au courant d'une telle expression régulière. Néanmoins %ilike% me semble plus intuitif. Peut-être parce que je connais PostgreSQL. Dans l'ensemble, c'est une question de style de codage de toute façon.

@andreasLD merci encore d'avoir soulevé. Vous avez probablement vu puisque vous avez également commenté là-bas, mais en notant pour mémoire que cela a été fermé dans # 3333 et # 3552

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

mattdowle picture mattdowle  ·  3Commentaires

nachti picture nachti  ·  3Commentaires

alex46015 picture alex46015  ·  3Commentaires

st-pasha picture st-pasha  ·  3Commentaires

MichaelChirico picture MichaelChirico  ·  3Commentaires