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)