R 展开data.tables的列表列

R 展开data.tables的列表列,r,data.table,R,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 <- 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>
我知道如何用
rbindlist
扩展嵌入的
数据.table
部分,但不知道如何用变量“id”绑定展开的
数据.table


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

在本例中,
dt[,var[[1]],by=id]
有效。但是,我使用的是
rbindlist
,如OP所述:

dt[, r := as.character(.I) ]
res <- dt[, rbindlist(setNames(var, r), id="r")]
这在以下几个方面优于
dt[,var[[1]],by=id]

  • rbindlist
    应该比包含大量
    by=
    组的内容更快
  • 如果
    dt
    中有更多变量,则所有变量都必须以
    by=
    结束
  • 可能根本不需要从
    dt
    中继承变量,因为它们总是可以稍后从该表中获取,并且占用的内存更少

@Frank感谢您的评论,但我必须说,此解决方案仅适用于id唯一的情况。如果id是重复的,那么var[[1]]只检索每个id的第一行。我修改了我的示例以合并这种情况。好的,我想我的答案(下面)已经处理了。相关:Fwiw,下面是我对
dt
中“更多变量”的想法的一个说明:(
fn
year
列)谢谢!我正在研究,你的密码救了我的命!超快的。现在我只有一个问题,我认为没有必要在rbindlist中添加“setNames”函数,因为没有它我会得到相同的结果。你能解释一下吗?@R.Zhu酷!是的,很好的观察,你是对的。我想我习惯使用它,因为一般来说,人们可能希望链接列不是行号。例如,如果
dt[,r:=sprintf(“%07f.”,.I)]
(行号带前导零),或者如果处理文件(如链接示例)并使用文件名链接。@Frank优秀的r/data.table教程!谢谢分享。
dt[, r := as.character(.I) ]
res <- dt[, rbindlist(setNames(var, r), id="r")]
res[dt, on=.(r), `:=`(id = i.id)]