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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值