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)