我有一个拥有数百万行数据的大型(大量使用
由于存在列表列,因此之前关于处理融合数据表的问题的回答并不适用。我对自己找到的解决方案不满意,希望能得到更简单/更快的实现建议。
melt
方法展开到variable
和value
列中)的融合data.table
。我需要将这个表格转换成宽格式(将变量展开)。问题在于,该数据表还具有名为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>