10. 表の作成が速い
14
> grpsize = ceiling(1e8/26^2)
> tt=system.time( DF <- data.frame(
+ x=rep(LETTERS,each=26*grpsize),
+ y=rep(letters,each=grpsize),
+ v=runif(grpsize*26^2),
+ stringsAsFactors=FALSE)
+ )
> tt
ユーザ システム 経過
18.319 9.352 35.238
> head(DF)
x y v
1 A a 0.5229118
2 A a 0.8970509
3 A a 0.6302130
4 A a 0.5424760
5 A a 0.2111072
6 A a 0.6619162
> grpsize = ceiling(1e8/26^2)
> tt=system.time( DT <- data.table(
+ x=rep(LETTERS,each=26*grpsize),
+ y=rep(letters,each=grpsize),
+ v=runif(grpsize*26^2))
+ )
> tt
ユーザ システム 経過
6.866 0.980 8.787
> head(DT)
x y v
1: A a 0.4385627
2: A a 0.6508053
3: A a 0.7925830
4: A a 0.4220287
5: A a 0.8465619
6: A a 0.5719564
data.frame data.table
data.tableの方が表の作成が速い!
data.tableの使い方
13. 全行表示しない
17
> dim(DT)
[1] 100000004 3
> DT
x y v
1e+00: A a 0.4385627
2e+00: A a 0.6508053
3e+00: A a 0.7925830
4e+00: A a 0.4220287
5e+00: A a 0.8465619
---
1e+08: Z z 0.2710513
1e+08: Z z 0.1001215
1e+08: Z z 0.7190453
1e+08: Z z 0.3677681
1e+08: Z z 0.4660653
data.tableの使い方
うっかり全行表示しようとしない!
→安心!
17. i: 行へのアクセス
21
> dt
x v
1: b -1.07907245
2: b 0.92515170
3: b -0.02339863
4: a 2.06498547
5: a -1.03080796
> dt[2,]
x v
1: b 0.9251517
> dt[dt$x=="b",]
x v
1: b -1.07907245
2: b 0.92515170
3: b -0.02339863
> dt["b",]
以下にエラー `[.data.table`(dt, "b", ) :
When i is a data.table (or character vector), x must be keyed (i.e. sorted, and, marked as sorted) so
data.table knows which columns to join to and take advantage of x being sorted. Call setkey(x,...) first, see
?setkey.
data.tableの使い方
18. i: キーによる行へのアクセス
22
> setkey(dt, x)
> tables()
NAME NROW MB COLS KEY
[1,] dt 5 1 x,v x
[2,] dt_car 50 1 speed,dist
Total: 2MB
> dt["b",]
x v
1: b -1.07907245
2: b 0.92515170
3: b -0.02339863
data.tableの使い方
20. j: 集計する(例)
24
> DT[,sum(v)]
[1] 49994142
data.tableの使い方
> DT[,sum(v),by=x]
x V1
1: A 1922034
2: B 1922008
3: C 1923013
4: D 1922349
5: E 1922904
6: F 1923302
7: G 1922370
8: H 1923551
9: I 1922727
10: J 1922573
11: K 1922276
12: L 1922843
13: M 1922837
14: N 1923137
15: O 1922958
16: P 1923937
17: Q 1922784
18: R 1923248
19: S 1922781
20: T 1922965
21: U 1924161
22: V 1922554
23: W 1923009
24: X 1922651
25: Y 1922543
26: Z 1922629
x V1
byで列名を指定すると
指定した変数の値により
行をグループ分けした上で
sum(v)を行う
sum(v)を行う
jの位置では、
列名は引用符で囲まない
> system.time(tt <- tapply(DT$v,DT$x,sum))
ユーザ システム 経過
35.287 14.561 56.807
> system.time(ss <- DT[,sum(v),by=x])
ユーザ システム 経過
1.704 0.441 2.395
tapplyより速い!