我有一个大型数据框(大约几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()
Run Code Online (Sandbox Code Playgroud)
随着输出:
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 …Run Code Online (Sandbox Code Playgroud) 我经常发现一些问题,人们不知何故以未命名字符向量的未命名列表结束,他们想将它们逐行绑定到data.frame. 下面是一个例子:
library(magrittr)
data <- cbind(LETTERS[1:3],1:3,4:6,7:9,c(12,15,18)) %>%
split(1:3) %>% unname
data
#[[1]]
#[1] "A" "1" "4" "7" "12"
#
#[[2]]
#[1] "B" "2" "5" "8" "15"
#
#[[3]]
#[1] "C" "3" "6" "9" "18"
Run Code Online (Sandbox Code Playgroud)
一种典型的方法是使用do.call基础 R。
do.call(rbind, data) %>% as.data.frame
# V1 V2 V3 V4 V5
#1 A 1 4 7 12
#2 B 2 5 8 15
#3 C 3 6 9 18
Run Code Online (Sandbox Code Playgroud)
也许一种效率较低的方法是Reduce从基础 R 开始。
Reduce(rbind,data, init …Run Code Online (Sandbox Code Playgroud)