'''
data.table(DT)的操作语句类似于SQL,DT[i, j, by]中的i, j, by 对应着SQL语句的 i=where, j=select, by=group by。所以DT中的i, j并不是只是像data.frame只代表着行列,它更加的灵活多变。
符号 ” := “快速的增加或者删除列,类似SQL的update。
setkey(DT, colA, colB),可以使得检索和分组更加快速
order,快速多重排序, 例如对DT按照x,y进行排序DT[order(DT$x, -DT$y),]或者DT[with(DT, order(x, -y)),]
'''
grpsize <- ceiling(1e7/26^2) ##10^7 rows, 676 groups
DF <- data.frame(x=rep(LETTERS,each=26*grpsize),
y=rep(letters,each=grpsize), v=runif(grpsize*26^2),
stringsAsFactors=FALSE)
DT <- as.data.table(DF) ##creat data.table
setkey(DT,x,y)
###比较检索速度
system.time(DF[DF$x=="R"&DF$y=="h",])
system.time(DT[DT$x=="R"&DT$y=="h",])
####快速分组,按照x分组,然后计算sum(v)
#tapply
system.time(tapply(DT$v, DT$x, sum))
system.time(ss<-DT[,sum(v),by=x])
head(ss)
ss
###其他操作
##联表和统计计算,更清晰认知,DT[i,j,by]中的i,j,by对应着SQL语句的i=where,j=selet,by=group by
DT = data.table(x=rep(c("a","b","c"),each=3), y=c(1,3,6), v=1:9) ##creat data.table DT
X = data.table(c("b","c"),foo=c(4,2)) ##use to join
setkey(DT,x) #set the key
##join类型1,联表,X中有b,c
DT[X]
##join类型2,类似查询,.()表示list,类似于联一个1行2列的表哦
DT[.("a",3)]
DT[,list(mysum=sum(v),Mymin=min(v)),by=.(x)]
DT[,list(mysum=sum(v),Mymin=min(v)),by=x]
cd[, ypf :=xyf + chengyf + caoyf]
cd[,year:=as.Date(ISOdate(as.POSIXlt(cyrq)),1,1)]
if(false){
tmp_0=ddply(cd,.(year),function(cd){
data.frame(table(cd$cyfs)/length(cd$cyfs))})
tmp_0=tapply(cyfs,year,function(x){prop.table(table(x))})
tmp_0=ldply(tmp_0,data.frame)
}
#利用data.table完成比率计算
tmp_0=cd[,list(cf=sort(unique(cyfs)),ratio=as.numeric(table(cyfs)/length(cyfs))),by="year"]