title: "读写竞赛"
author: "ky"
date: "2020年1月28日"
output: word_document
如果我们在R中已经得到了一个非常大的数据文件,应该用什么工具才能迅速写出这个数据表呢?
如果我们在文件夹中有一个很大的数据表文件,怎样才能迅速读取并载入工作区间呢?
下面我们构建一个较大的数据框,实践测试一下。
library(pacman)
p_load(fst,feather,data.table,tidyverse)
nr_of_rows <- 1e7
df <- data.frame(
logical = sample(c(TRUE,FALSE,NA),prob = c(0.85,0.1,0.05),nr_of_rows,replace = TRUE),
Integer = sample(1L:100L,nr_of_rows,replace = TRUE),
Real = sample(sample(1:10000,20)/100,nr_of_rows,replace = TRUE),
Factor = as.factor(sample(labels(UScitiesD),nr_of_rows,replace = TRUE))
)
查看一下数据文件大小
object.size(df) %>%
print(unit = 'auto')
csv组别
write.csv base包中基础函数
write_csv tidyverse包中的函数
fwrite data.table包中的函数
setwd('e:/r-lhtz')
p_load(microbenchmark)
microbenchmark(write.csv(df,'df_base.csv'),
write_csv(df,'df_readr.csv'),
fwrite(df,'df_dt.csv'),
times = 1,unit = 's')
读入测试(统一读入df_dt数据)
microbenchmark(read.csv('df_dt.csv') -> df_base,
read_csv('df_dt.csv') -> df_readr,
fread('df_dt.csv') -> df_dt,
times = 1,unit = 's')
df_dt %>% as_tibble() -> df_readr1 #使用data.table读入转化为tidyverse系统处理
df_readr1
gdata::keep(df,sure =T) #仅仅保留df变量
file.remove(c('df_dt.csv','df_base.csv','df_readr.csv')) #删除写入文件
2.bin组别
二进制可以获得更快的读写速度,在base包中,存储一个数据表可以使用saveRDS函数,文件后缀为“.rds”,重新
读取可以使用readRDS函数。在tidyverse生态系统中,readr包提供了read_rds函数和write_rds函数。data.table
则主要有feather和fst包。
microbenchmark(write_rds(df,'df.rds'),
write_feather(df,'df.feather'),
write_fst(df,'df.fst'),
times = 10,unit = 's')
microbenchmark(read_rds('df.rds') -> df_rds,
read_feather('df.feather') -> df_feather,
read_fst('df.fst') -> df_fst,
times = 10, unit = 's')
setequal(df,df_rds)
setequal(df,df_feather)
setequal(df,df_fst)
file.remove(c('df.rds','df.feather','df.fst'))
数据存取转换的瑞士军刀(rio)
rio包能够对各种格式进行输入和输出,首次使用需要安装rio包
library(pacman)
p_load(rio)
export(iris,'iris.xlsx')
export(list(mtcars =mtcars,iris=iris),file = 'mtcars_iris.xlsx') #两个数据集生成在一个文件中的两个sheet
import_list('mtcars_iris.xlsx') -> mtcars_iris
mtcars_iris[[1]]
mtcars_iris[[2]]
import_list('mtcars_iris.xlsx',which = 2) -> iris2 #指定取出第2个工作簿文件
iris2
rio包中的convert函数支持格式转换
convert('iris.xlsx','iris.fst')
unlink(c('iris.xlsx','mtcars_iris.xlsx','iris.fst','iris.csv','iris1.csv')) #unlink等价于file.remove