Data.table: sertakan %ilike% PostgreSQL ke dalam data.table

Dibuat pada 13 Des 2017  ·  3Komentar  ·  Sumber: Rdatatable/data.table

Saya sangat menyukai operator %like% di data.table karena saya terbiasa dengan kueri SQL. Di PostgreSQL juga ada opsi ILIKE di mana __i__ singkatan dari case-__insensitive__.

Apa pendapat Anda tentang memasukkan %ilike% ke dalam data.table?

Untuk memasukkan ini ke dalam data.table saya akan membuat operator %ilike% di ilike.R berdasarkan like.R menambahkan ignore.case = TRUE ke panggilan grep() sebagai berikut:

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

contoh yang dapat direproduksi:

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

Komentar yang paling membantu

Benar itu juga berfungsi, tidak mengetahui regex seperti itu. Namun demikian %ilike% tampaknya lebih intuitif bagi saya. Mungkin karena saya tahu PostgreSQL. Secara keseluruhan ini adalah pertanyaan tentang gaya pengkodean.

Semua 3 komentar

Anda dapat menggunakan tag (?i) sebagai gantinya:

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

Benar itu juga berfungsi, tidak mengetahui regex seperti itu. Namun demikian %ilike% tampaknya lebih intuitif bagi saya. Mungkin karena saya tahu PostgreSQL. Secara keseluruhan ini adalah pertanyaan tentang gaya pengkodean.

@andreasLD sekali lagi terima kasih telah membesarkan. Anda mungkin melihat sejak Anda berkomentar di sana juga tetapi mencatat bahwa ini ditutup di #3333 dan #3552

Apakah halaman ini membantu?
0 / 5 - 0 peringkat