将数据帧转换为data.table而不复制

时间:2013-12-03 07:12:47

标签: r dataframe reference data.table

我有一个大型数据框(大约几GB),我想将其转换为data.table。使用as.data.table创建数据框的副本,这意味着我需要的可用内存至少是数据大小的两倍。有没有办法在没有副本的情况下进行转换?

以下是一个简单的示例:

library(data.table)
N <- 1e6
K <- 1e2
data <- as.data.frame(rep(data.frame(rnorm(N)), K))

gc(reset=TRUE)
tracemem(data)
data <- as.data.table(data)
gc()

输出:

library(data.table)
# data.table 1.8.10  For help type: help("data.table")
N <- 1e6
K <- 1e2
data <- as.data.frame(rep(data.frame(rnorm(N)), K))

gc(reset=TRUE)
# used  (Mb) gc trigger   (Mb)  max used  (Mb)
# Ncells    303759  16.3     597831   32.0    303759  16.3
# Vcells 100442572 766.4  402928632 3074.2 100442572 766.4
tracemem(data)
# [1] "<0x363fda0>"
data <- as.data.table(data)
# tracemem[0x363fda0 -> 0x31e4260]: copy as.data.table.data.frame as.data.table 
gc()
# used  (Mb) gc trigger   (Mb)  max used   (Mb)
# Ncells    304519  16.3     597831   32.0    306162   16.4
# Vcells 100444242 766.4  322342905 2459.3 200933219 1533.0

1 个答案:

答案 0 :(得分:77)

可从v1.9.0+获取。来自NEWS

  

o关注this S.O. post,现在实现了setDT函数list(已命名和/或未命名),data.frame(或data.table)作为输入并返回与data.table 相同的对象(没有任何副本)。有关详情,请参阅?setDT示例。

这符合data.table命名约定 - 所有set*函数都通过引用进行修改。 :=是唯一也通过引用修改的其他内容。

require(data.table) # v1.9.0+
setDT(data) # converts data which is a data.frame to data.table *by reference*

查看较早(现已过时)答案的历史记录。