数据的读写处理

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

你可能感兴趣的:(数据的读写处理)