展开data.tables的列表列

R. *_*Zhu 4 r data.table

我有一个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万行并且有几十个变量,所以如果您提出的解决方案不仅可行而且内存效率高,我将非常感激.

Fra*_*ank 6

在这种情况下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=.
  • 可能根本不需要携带vars dt,因为它们总是可以从那个表中获取,并且它们在那里占用的内存要少得多.

  • @Frank优秀的R/data.table教程!感谢分享. (3认同)