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
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)]