1) Если условия являются взаимоисключающими со значением по умолчанию, если все условия являются ложными, то это работает:
library(data.table)
DT <- as.data.table(df) # df is from question
DT[, new := c("e", "c", "d")[1 +
1 * (a == "a" & b == "b") +
2 * (a == "b" & b == "a")]
]
, давая:
> DT
a b new
1: a b c
2: b a d
3: a a e
2) Если результаты условий являются числовыми, то это еще проще.Например, предположим, что вместо c
и d
мы хотим 10 и 17 со значением по умолчанию 3. Тогда:
library(data.table)
DT <- as.data.table(df) # df is from question
DT[, new := 3 +
(10 - 3) * (a == "a" & b == "b") +
(17 - 3) * (a == "b" & b == "a")]
3) Обратите внимание, что добавление 1-строкидостаточно для реализации этого.Предполагается, что для каждого ряда имеется хотя бы одна ИСТИНА.
when <- function(...) names(match.call()[-1])[apply(cbind(...), 1, which.max)]
# test
DT[, new := when(c = a == 'a' & b == 'b',
d = a == 'b' & b == 'a',
e = TRUE)]