我有一个大的(数百万行)融化了 data.table
,通常在 variable
和 value
列中展开 melt
样式 . 我需要以宽泛的形式转换表(滚动变量) . 问题是数据表还有一个名为 data
的列表列,我需要保留它 . 这使得无法使用 reshape2
因为 dcast
无法处理非原子列 . 因此,我需要自己卷起来 .
由于列表列,previous question关于使用熔化数据表的答案不适用于此处 .
我对我提出的解决方案不满意 . 我正在寻找更简单/更快实现的建议 .
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>
2 回答
我有一些欺骗方法可能会做到这一点 - 重要的是,我认为每个x,y,列表组合都是独一无二的!如果没有,请忽略 .
我将创建两个单独的数据表,第一个是没有数据列表对象的数据,第二个只有唯一的数据列表对象和一个键 . 然后将它们合并在一起以获得所需的结果 .
自2013年以来,这个古老的问题激起了我的好奇心,因为它已经有了很大的改善 .
但是,即使使用
data.table
版本1.11.4仍然会返回错误
解决方法遵循jonsedar's answer的大纲:
将非列表列从长格式重新格式化为宽格式
汇总列表列
data
按x
和y
分组在
x
和y
上加入两个部分结果但使用实际
data.table
语法的功能,例如on
参数:列表列
data
通过获取第一个元素进行聚合 . 这符合OP的代码行这也选择了第一个元素 .