R语言ffbase包读取并处理大数据集

R语言中data.table包用于处理大数据集(GB级或TB级),但其无法逃掉内存不足的限制,对于电脑内存只有4G或8G的我们来说会把内存撑爆,不知道你有没有这个体验,真是令人头痛,据说ff包的read.table.ffdf()函数可以把TB级的大数据集映射到硬盘,调用ffbase包使用R语言的基础函数来处理这些大数据集,下面来做个简单介绍:

#安装或加载ffbase包会连带安装或加载ff等包
if(!suppressWarnings(require(ffbase))){
  install.packages("ffbase")
  require(ffbase)
}
#数据读取
data<-read.table.ffdf(x=NULL,#这个要设置,否则会报错,因为初次读取不追加,所以NULL
                      file = "f:/销售流水整合数据/销售流水2016.csv",#假如大数据集csv文件存放在此目录下
                      FUN = "read.csv",#读取csv文件的函数
                      sep=",",#csv文件的字段分隔符
                      header=TRUE,#表头
                      nrows=-1,#读取csv文件的多少行数据,-1代表全部读取
                      first.rows=1000,#第一批读取多少行
                      next.rows=NULL,#接下来读取多少行
                      colClasses="factor",#可以在读取时指定每列的数据类型,如c("factor","integer","numeric")
                      fill=TRUE
                      )
#4G的数据读取后只有117M的ff文件,并且不在内存

#ff数据对象保存
ffsave(data,file="f:/销售流水整合数据/data")
#这里注意不用文件名+后缀名(filename.ff),直接存储目录+文件名即可

#加载ff对象
ffload(file="f:/销售流水整合数据/data")

#加载后用ffdfdply()函数处理
dat<-ffdfdply(data,split=as.character(data$门店名称),FUN=function(data){
  #这个处理是在内存进行,可以调用data.table包快速处理,或使用R基础函数也行
  require(data.table)
  data<-setDT(data)
  data$销售数量<-as.numeric(data$销售数量)
  data<-data[,list(销量=sum(销售数量)),by=list(门店名称,营业员名称)]
  #这个必须有,ffdfdply()函数要求返回一个data.frame
  as.data.frame(data)
},trace=FALSE)
#split参数根据你电脑内存设置,我这里按照"门店名称"分隔,然后在内存批处理
#设置trace=FALSE不显示运行提示信息

欢迎交流讨论,销售数据分析的小数据领域!

你可能感兴趣的:(R语言数据处理)