展开data.tables

时间:2017-04-01 04:31:02

标签: 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>

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

1 个答案:

答案 0 :(得分:6)

在这种情况下dt[, var[[1]], by=id]有效。但是,我使用rbindlist作为提到的OP:

dt[, r := as.character(.I) ]
res <- dt[, rbindlist(setNames(var, r), id="r")]

然后在rdt行)上合并,如果你真的需要任何变量:

res[dt, on=.(r), `:=`(id = i.id)]

这在某些方面优于dt[, var[[1]], by=id]

  • rbindlist应该比拥有大量by=组的内容更快。
  • 如果dt中有更多变量,则所有变量都必须以by=结尾。
  • 可能根本没有必要从dt继承vars,因为它们以后总是可以从那个表中获取,并且它们占用的内存要少得多。