Data.table: PostgreSQL์˜ %ilike%๋ฅผ data.table์— ํฌํ•จ

์— ๋งŒ๋“  2017๋…„ 12์›” 13์ผ  ยท  3์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: Rdatatable/data.table

๋‚˜๋Š” SQL ์ฟผ๋ฆฌ์— ์ต์ˆ™ํ•˜๊ธฐ ๋•Œ๋ฌธ์— data.table์˜ %like% ์—ฐ์‚ฐ์ž๋ฅผ ์ƒ๋‹นํžˆ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. PostgreSQL์—๋Š” __i__๊ฐ€ ๋Œ€์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š๋Š”__์„ ๋‚˜ํƒ€๋‚ด๋Š” ILIKE ์˜ต์…˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

%ilike% ๋ฅผ data.table์— ํฌํ•จ์‹œํ‚ค๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

์ด๊ฒƒ์„ data.table์— ํฌํ•จํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ignore.case = TRUE ๋ฅผ grep() ํ˜ธ์ถœ์— ์ถ”๊ฐ€ํ•˜๋Š” like.R์„ ๊ธฐ๋ฐ˜์œผ๋กœ ilike.R์—์„œ %ilike% ์—ฐ์‚ฐ์ž๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

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

์žฌํ˜„ ๊ฐ€๋Šฅํ•œ ์˜ˆ:

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

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ด๋ฉฐ ๊ทธ๋Ÿฌํ•œ ์ •๊ทœ์‹์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  %ilike% ๊ฐ€ ๋” ์ง๊ด€์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‚ด๊ฐ€ PostgreSQL์„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์€ ์–ด์จŒ๋“  ์ฝ”๋”ฉ ์Šคํƒ€์ผ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“  3 ๋Œ“๊ธ€

๋Œ€์‹  (?i) ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ž˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ด๋ฉฐ ๊ทธ๋Ÿฌํ•œ ์ •๊ทœ์‹์„ ์ธ์‹ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  %ilike% ๊ฐ€ ๋” ์ง๊ด€์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‚ด๊ฐ€ PostgreSQL์„ ์•Œ๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ ์ด๊ฒƒ์€ ์–ด์จŒ๋“  ์ฝ”๋”ฉ ์Šคํƒ€์ผ์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

@andreasLD ๋‹ค์‹œํ•œ๋ฒˆ ์˜ฌ๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‹น์‹ ์ด ๊ฑฐ๊ธฐ์— ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ ๋ณด์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด #3333๊ณผ #3552์—์„œ ๋‹ซํ˜”๋‹ค๋Š” ๊ธฐ๋ก์— ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰