It’s often easier to use ifelse to implement conditioning. The fast implementation in data.table of ifelse is fifelse. Other approach to do multiple conditioning is to use data.table::fcase or dplyr::case_when.

fcase

fcase can be used directly

  x <- 1:6
  data.table::fcase(x < 3, 1,
                    x >= 4, 2)

To implement in a data.table to create a new columns

  library(data.table)

  dt <- data.table(v1 = letters[1:6],
                   v2 = rep(1:2, 3),
                   v3 = rep(LETTERS[1:3], 2))
  > dt
     v1 v2 v3
  1:  a  1  A
  2:  b  2  B
  3:  c  1  C
  4:  d  2  A
  5:  e  1  B
  6:  f  2  C
  dt[, v4 := fcase(v1 == "a" & v3 == "A", 2,
                   v2 == 1 & v3 %chin% c("A", "B"), 3,
                   default = 0)]
  > dt
     v1 v2 v3 v4
  1:  a  1  A  2
  2:  b  2  B  0
  3:  c  1  C  0
  4:  d  2  A  0
  5:  e  1  B  3
  6:  f  2  C  0

You could also use assignment by reference using := to get similar results but fcase is the fast implementation.

  dt[v1 == "a" & v3 == "A", v4 := 2]

case_when

dplyr approach to implement similar results

  dplyr::case_when(x < 3 ~ 1,
                   x >= 4 ~ 2)
comments powered by Disqus