我有一个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>
Run Code Online (Sandbox Code Playgroud)
现在我想将这个结构"取消列出":
a b id
1: 1 3 1
2: 2 4 1
3: 5 7 1
4: 6 8 1
5: 9 10 2
Run Code Online (Sandbox Code Playgroud)
我知道如何扩展嵌入式data.table部分rbindlist,但只是不知道如何将变平data.table的变量与"变量" 绑定.
原始数据集是3000万行并且有几十个变量,所以如果您提出的解决方案不仅可行而且内存效率高,我将非常感激.
在这种情况下dt[, var[[1]], by=id]工作.但是,我用rbindlistOP作为提到的:
dt[, r := as.character(.I) ]
res <- dt[, rbindlist(setNames(var, r), id="r")]
Run Code Online (Sandbox Code Playgroud)
然后合并r(行dt)如果你真的需要任何变量:
res[dt, on=.(r), `:=`(id = i.id)]
Run Code Online (Sandbox Code Playgroud)
这比dt[, var[[1]], by=id]以下几种方式更好:
rbindlist应该比拥有很多by=群体的东西更快.dt,它们都必须最终进入by=.dt,因为它们总是可以从那个表中获取,并且它们在那里占用的内存要少得多.