Вот 2 варианта:
1) Использование get
строка за строкой с учетом комментария Фрэнка:
DT[, new_col := get(paste0("month_", month.idx)), by= month.idx]
2) Растопить, а затем присоединиться, чтобы выполнить поиск
DT[, variable := paste0("month_", month.idx)]
DT[melt(DT, id.vars="id", measure.vars=patterns("^month_")),
on=.(id, variable), new_col := value]
Скорость зависит от количества строк и столбцов месяца, которые у вас есть.
data:
DT <- fread("id month_1 month_2 month_3 month_4 month_5 month.idx
x1 1 1 1 0 1 3
x2 0 0 0 1 0 4
x3 1 0 0 0 0 1
x4 0 0 0 0 0 5
x5 1 1 0 0 1 2
x6 0 1 0 1 1 3
x7 0 0 1 1 1 4
x8 0 0 0 0 0 1")