我有一个data.table
列表列,其中每个元素都是data.table
:
dt <- data.table(id = c(1, 1, 2),
var = list(data.table(a = c(1, 2), b = c(3, 4)),
data.table(a = c(5, 6), b = c(7, 8)),
data.table(a = 9, b = 10)))
dt
# id var
# 1: 1 <data.table>
# 2: 1 <data.table>
# 3: 2 <data.table>
现在我想&#34;取消列表&#34;这个结构:
a b id
1: 1 3 1
2: 2 4 1
3: 5 7 1
4: 6 8 1
5: 9 10 2
我知道如何使用data.table
扩展嵌入的rbindlist
部分,但是根本不知道如何将展平的data.table
与变量&#34; id&#34;。< / p>
原始数据集是3000万行并且有几十个变量,所以如果您提出的解决方案不仅可行而且内存效率高,我将非常感激。
答案 0 :(得分:6)
在这种情况下dt[, var[[1]], by=id]
有效。但是,我使用rbindlist
作为提到的OP:
dt[, r := as.character(.I) ]
res <- dt[, rbindlist(setNames(var, r), id="r")]
然后在r
(dt
行)上合并,如果你真的需要任何变量:
res[dt, on=.(r), `:=`(id = i.id)]
这在某些方面优于dt[, var[[1]], by=id]
:
rbindlist
应该比拥有大量by=
组的内容更快。dt
中有更多变量,则所有变量都必须以by=
结尾。dt
继承vars,因为它们以后总是可以从那个表中获取,并且它们占用的内存要少得多。