gpt4 book ai didi

r - 展开 data.tables 的列表列

转载 作者:行者123 更新时间:2023-12-05 00:16:00 25 4
gpt4 key购买 nike

我有一个 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>

现在我想“取消列出”这个结构:
   a  b id
1: 1 3 1
2: 2 4 1
3: 5 7 1
4: 6 8 1
5: 9 10 2

我知道如何扩展嵌入式 data.tablerbindlist 分开,但只是不知道如何绑定(bind)扁平的 data.table带有变量“id”。

原始数据集是 3000 万行,有几十个变量,所以如果你能提出不仅可行而且内存效率高的解决方案,我将不胜感激。

最佳答案

在这种情况下 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完全可以,因为它们以后总是可以从该表中获取,并且它们在那里占用的内存要少得多。
  • 关于r - 展开 data.tables 的列表列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43152845/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com