我有一个大的数据帧(大约几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

推荐答案

这是从v1.9.0+.从NEWS开始:

o继this S.O. post之后,现在实现了一个函数setDT,它以list(命名和/或未命名)、data.frame(或data.table)作为输入,并返回与data.table by reference相同的对象(没有任何副本).更多信息请参见?setDT个示例.

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

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

请参阅历史,了解更老(现已过时)的答案.

R相关问答推荐

Select R中列未排序的收件箱中的最后一个按顺序编号的列

基于2行删除重复项指定每列要执行的操作

从R中的函数中提取变量以及它们来自哪些环境?

对lme 4对象运行summary()时出错(diag中的错误(from,names = RST):对象unpackedMatrix_diag_get找不到)

根据R中的另一个日期从多列中 Select 最近的日期和相应的结果

手动打印线型gplot

用相同方法得到不同函数的ROC最优截断值

使用ggsankey调整Sankey图中单个 node 上的标签

使用较长的查询提取具有部分匹配的列表中的较短目标,

绘制采样开始和采样结束之间的事件

如何通过匹配R中所有可能的组合来从宽到长旋转多个列?

从R中的对数正态分布生成随机数的正确方法

基于Key->Value数据帧的基因子集相关性提取

从多个可选列中选取一个值到一个新列中

主题(Legend.key=Element_RECT(Fill=&Quot;White&Quot;))不起作用

名字的模糊匹配

如何使投篮在R中保持一致

将美学添加到ggploy中的文本标签

如何用不同长度的向量填充列表?

有没有办法更改ggplot2中第二个y轴的比例限制?