我有一个大的(数百万行)data.table
与通常的melt
- 风格展开在variable
和value
列中融化。我需要以广泛的形式投射表格(向上滚动变量)。问题是数据表还有一个名为 的列表列data
,我需要保留它。这使得它无法使用reshape2
,因为dcast
无法处理非原子列。因此,我需要自己做卷起。
由于列表列的原因,上一个关于使用融化数据表的问题的答案在这里不适用。
我对我提出的解决方案不满意。我正在寻找更简单/更快实施的建议。
x <- LETTERS[1:3]
dt <- data.table(
x=rep(x, each=2),
y='d',
data=list(list(), list(), list(), list(), list(), list()),
variable=rep(c('var.1', 'var.2'), 3),
value=seq(1,6)
)
# Column template set up
list_template <- Reduce(
function(l, col) { l[[col]] <- col; l },
unique(dt$variable),
list())
# Expression set up
q <- substitute({
l <- lapply(
list_template,
function(col) .SD[variable==as.character(col)]$value)
l$data = .SD[1,]$data
l
}, list(list_template=list_template))
# Roll up
dt[, eval(q), by=list(x, y)]
x y var.1 var.2 data
1: A d 1 2 <list>
2: B d 3 4 <list>
3: C d 5 6 <list>