data.table
是一个十分有效的数据处理包,它是data.frame
的一个扩展,能够快速的对数据进行分片,分组,聚合等操作,比data.frame
快很多。在数据处理方面,据实验结果表明,对于2G的数据,tapply
耗时16秒,而data.table
耗时1.6秒,快了10倍,官方还介绍说,对于100G的数据,它还能运行很好。
下面介绍几个主要用到的函数:
fread
和read.table
相似,但是更快更方便
fread(input, sep="auto", sep2="auto", nrows=-1L, header="auto", na.strings="NA", file,
stringsAsFactors=FALSE, verbose=getOption("datatable.verbose"), autostart=1L,
skip=0L, select=NULL, drop=NULL, colClasses=NULL,
integer64=getOption("datatable.integer64"), # default: "integer64"
dec=if (sep!=".") "." else ",", col.names,
check.names=FALSE, encoding="unknown", quote="\"",
strip.white=TRUE, fill=FALSE, blank.lines.skip=FALSE, key=NULL,
showProgress=getOption("datatable.showProgress"), # default: TRUE
data.table=getOption("datatable.fread.datatable") # default: TRUE
)
主要参数:
input
:输入的文件,也可以是一个URL
sep
:列的分隔符,默认的是符号集[,\t |;:]中的第一个
nrows
:要读取的行数,默认为-1为全部
header
:第一行是否为列名
stringAsFactors
:是否把字符串的列转化为因子向量
skip
:skip>0
意味着开始于第skip+1
行
select
:选择要留下的列向量,丢弃剩下的
drop
:和seelct
相反
colClasses
:设定列的类型,一个向量或一个列表
key
:传递到setkey
的列名的字符向量,像key="x,y,z"
或key=c("x","y","z")
,只有当data.table=TRUE
时才有效
data.table
:TRUE时返回一个data.table
,FALSE时返回一个data.frame
n=1e7
DT = data.table( a=sample(1:1000,n,replace=TRUE),
b=sample(1:1000,n,replace=TRUE),
c=rnorm(n),
d=sample(c("foo","bar","baz","qux","quux"),n,replace=TRUE),
e=rnorm(n),
f=sample(1:1000,n,replace=TRUE) )
fwrite(DT,"DT.csv",row.names = F)
写入的数据507M。下面试一试fread
,read.csv
和read_csv
的读入时间。
system.time(DT <- fread("DT.csv",header=F))
Read 10000001 rows and 6 (of 6) columns from 0.495 GB file in 00:02:01
用户 系统 流逝
118.44 1.83 121.09
system.time(dt <- read.csv("DT.csv",header=F))
用户 系统 流逝
1436.48 6.53 1454.64
library(readr)
system.time(dt <- read_csv("DT.csv"))
用户 系统 流逝
19.67 0.58 22.26
这儿有些奇怪,用readr
包里的read_csv
竟然比fread
要快,我又试了几次,fread
几次读取时间差别都很大,在读取到80%之前,几乎每秒读取20%,但是在80%上卡了,最后平均用时40多秒。
fsort
fsort(x, decreasing = FALSE, na.last = FALSE, internal=FALSE, verbose=FALSE, ...)
参数:
x
:向量
decreasing
:是否是降序排列
na.last
:对NA的控制,如果TRUE,则数据中的缺失值放到最后,如果FALSE,放在最前,如果是NA,则去除。
x = runif(1e7)
system.time(ans1 <- sort(x,method="quick"))
用户 系统 流逝
2.53 0.10 2.62
system.time(ans2 <- fsort(x))
用户 系统 流逝
0.78 0.19 0.35
duplicated
duplicated(x, incomparables=FALSE, fromLast=FALSE, by=seq_along(x), ...)
unique(x, incomparables=FALSE, fromLast=FALSE, by=seq_along(x), ...)
参数: