相关疑难解决方法(0)

将数据帧转换为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()
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)

r reference dataframe data.table

65
推荐指数
1
解决办法
5万
查看次数

按行绑定未命名向量的未命名列表的 Tidyverse 方法 - do.call(rbind,x) 等效

我经常发现一些问题,人们不知何故以命名字符向量的未命名列表结束,他们想将它们逐行绑定到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)

r dplyr data.table purrr tidyverse

34
推荐指数
6
解决办法
1116
查看次数

标签 统计

data.table ×2

r ×2

dataframe ×1

dplyr ×1

purrr ×1

reference ×1

tidyverse ×1