Некоторые опции:
1) с использованием for
:
cols <- c("V2", "V3")
for (x in cols)
set(dt, dt[get(x)==1L, which=TRUE], paste0(x,".twin"), x)
2) Подмножество в i
перед обновлением по ссылке
for (x in cols)
dt[get(x)==1L, paste0(x,".twin") := x]
3) индексирование вектора
cols <- c("V2", "V3")
dt[, paste0(cols, ".twin") := Map(function(x, nm) c(NA_character_, nm)[x+1L], .SD, cols), .SDcols=cols]
4) с использованием ifelse
dt[, paste0(cols, ".twin") := Map(function(x, nm) fifelse(x==1L, nm, NA_character_), .SD, cols), .SDcols=cols]
вывод:
V1 V2 V3 V2.twin V3.twin
1: 1 1 0 V2 <NA>
2: 2 0 1 <NA> V3
3: 3 1 0 V2 <NA>
4: 4 0 0 <NA> <NA>
5: 5 1 1 V2 V3
6: 6 0 0 <NA> <NA>
7: 7 1 0 V2 <NA>
8: 8 0 1 <NA> V3
9: 9 1 0 V2 <NA>
10: 10 0 0 <NA> <NA>
11: 11 1 1 V2 V3
12: 12 0 0 <NA> <NA>