Using by
:
DT[, if(nrow(colB[[1L]]) > 0)
colB[[1L]]
else
data.frame(colsubB1=NA_character_, colsubB2=NA_character_),
by=setdiff(names(DT), "colB")]
output:
colA colC colD colsubB1 colsubB2
1: A1 C1 D1 <NA> <NA>
2: A2 C2 D2 B2a B2c
3: A2 C2 D2 B2b B2d
4: A3 C3 D3 A3a A3c
5: A3 C3 D3 A3b A3d
data:
library(data.table)
DT <- data.table(colA= c('A1','A2','A3'),
colB=list(data.frame(),
data.frame(colsubB1=c('B2a','B2b'),colsubB2=c('B2c', 'B2d')),
data.frame(colsubB1=c('A3a','A3b'),colsubB2=c('A3c', 'A3d'))),
colC= c('C1','C2','C3'),
colD= c('D1','D2','D3')