Некоторые необработанные идеи:
1) Использование fcase()
, (которое в настоящее время доступно в версии для разработки):
o[, nc := fcase(
!is.na(a1), a1,
!is.na(a2), a2,
!is.na(a3), a3,
rep(TRUE, nrow(o)), as.double(default)
)]
2) Использование apply()
:
o[,
nc := apply(.SD, 1L, function(x) x[!is.na(x)][1L]),
.SDcol = patterns("^a|^default")]
3) Использование melt()
:
o[, row := .I]
o[, nc := o[, melt(.SD, id.vars = "row"), .SDcol = patterns("^a|^default|^row")
][!is.na(value), value[1L], by = row]$V1]
o[, row := NULL]
4) Использование set()
с вектором col_ind
:
for (i in seq_len(nrow(o))) set(o, i, "nc", value = o[[col_ind[i]]][i])
5) Использование max.col()
с матричной цифрой c индексирование:
o[, nc := {
m <- as.matrix(.SD)
m[cbind(seq.int(.N), max.col(!is.na(m), "first"))]
}]
6) Использование fcoalesce()
:
o[, names(o) := lapply(.SD, as.integer)][,
nc := fcoalesce(.SD)]
- Кредит на 5 и 6 для chinsoon12.