您的位置:首页 > 其它

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

2016-08-19 10:57 441 查看
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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐