R語言-data.table包使用(方便自己使用參考)

R語言-data.table包
它的fread函數讀取1G的CSV文件才用了20s左右。其他對data.frame的操作,也快了N倍
特點
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)),]


###生成數據#######setkey用法
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)
head(DF,3)
  x y     v
1 A a 0.5310106
2 A a 0.1980941
3 A a 0.8835322
library("data.table")
DT <- as.data.table(DF) ##creat data.table
setkey(DT,x,y) #s et the key建立索引
##################################################查詢用法
#比較檢索速度,搜索x=="R",y="h"  DT[i, j, by]中的i, j, by 對應着SQL語句的 i=where, j=select, by=group by。
system.time(ans1 <- DF[DF$x=="R" & DF$y=="h",])  #vector scan
 user  system  elapsed
0.528   0.016   0.544
system.time(ans2 <- DT[list("R","h")]) # binary search
 user  system  elapsed
0.004   0.000   0.001


####################################################
###快速分組,按照x分組,然後計算sum(v) 等同 selec sum(v) from DT group by x
#tapply(進行分組統計)
system.time(tt <- tapply(DT$v,DT$x,sum))
 user  system  elapsed
0.704   0.064   0.767
#syntax of data.table
system.time(ss <- DT[,sum(v),by=x])
 user  system  elapsed
0.080   0.000   0.078
#cheak ss and tt
head(ss)
   x     V1
1: A 192213.2
2: B 192183.3
3: C 192601.7
4: D 192308.0
5: E 192428.5
6: F 192071.0
head(tt)
   A        B        C        D        E        F
192213.2 192183.3 192601.7 192308.0 192428.5 192071.0


###Data preparation(準備)
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按照x建索引
########################cheak the data#######
DT
   x y v
1: a 1 1
2: a 3 2
3: a 6 3
4: b 1 4
5: b 3 5
6: b 6 6
7: c 1 7
8: c 3 8
9: c 6 9


X
  V1 foo
1:  b   4
2:  c   2
#################聯表,注key1聯的另一個表的第一列#################
##join類型1,聯表,X中有b,c   select DT.*,X.其他列 from DT join X on DT.x=X.1列 
DT[X]   ##join X,by the key x.
   x  y  v  foo
1: b 1 4   4
2: b 3 5   4
3: b 6 6   4
4: c 1 7   2
5: c 3 8   2
6: c 6 9   2
##join類型2,類似查詢,.() 表示list,類似於聯一個1行2列的表
DT[.("a",3)]      select DT.*,list.其他列 from DT  join list on DT.x=list.1列
   x y v V2
1: a 1 1  3
2: a 3 2  3
3: a 6 3  3
#############################計算建表#############
#where=DT, select=sum(v)....., group by DT$x
DT[,list(MySum=sum(v),
         MyMin=min(v),
         MyMax=max(v)),
   by=.(x)]    
   x MySum MyMin MyMax
1: a     6     1     3
2: b    15     4     6
3: c    24     7     9


稀疏矩陣
a,b是給出10*10 spase矩陣的哪個位置應該賦值爲1,a 爲行,b爲列,由於你的a,b在sample時有有放回的,因此可能出現重複值,這樣導致matrix的元素也可能重複,每重複一次,該元素值增加1,因此你上述代碼的matrix中(6,9)重複了一次,因此是2.解決該問題你可以用無放回抽樣。
library(Matrix)
set.seed(1) # 加入這個是爲了抽樣的結果是完全一樣的。
a<-sample(1:10,10,replace=F)
b<-sample(1:10,10,replace=F)
c<-sparseMatrix(a,b,x=1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章