R语言-data.table包使用(方便自己使用参考)
2018-02-11 10:14
507 查看
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)
它的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)
相关文章推荐
- R语言-data.table包使用(方便自己使用参考)
- 自己编写的Windows字符串类 封装字符串格式转换和常用操作 方便使用
- RecyclerView方便自己使用
- 如何把自己常用的类封装到DLL方便使用
- RGB颜色参考,方便自己查阅
- 第一次使用面向对象了解php流程(供自己参考)
- python 中NumPy和Pandas工具包中的函数使用笔记(方便自己查找)
- 以前一直用的别人的分页控件今天自己写了个方便自己(更新)使用正则表达式处理URL参数
- 对各大门户网站的rss源的频道进行分类,集合。使用excel制作,方便按自己需求排序
- [2013年]本人自己亲自使用800左右的性价好的平板供大家参考
- 使用Vitamio打造自己的Android万能播放器——一个系列,可以参考下
- 用百度地图API打造方便自己使用的手机地图
- (转)使用pth文件,让python方便的import自己写的模块
- 自己的无线网卡使用--方便以后自己查看
- Linux常用命令,学的时候自己记的常用的保存下来方便以后使用 o(∩_∩)o 哈哈
- 用百度地图API打造方便自己使用的手机地图
- 授权软件使用微信更改机器码挺方便的,做共享软件的可以参考一下
- 【086】部署nodejs程序时,如何把自己用到的npm模块封装成Docker镜像,方便在离线的时候使用?
- ASP.NET 4【MSDN参考文档-方便自己查阅】
- 我摘抄的webstorm快捷键仅仅自己做参考使用