私はこの金融取引のデータセットを持っています。かなり大きいですが、メモリに保持するには十分小さいです..
R> str(trans)
'data.frame': 130000000 obs. of 5 variables:
$ id : int 5 5 5 5 6 11 11 11 11 11 ...
$ kod : int 2 3 2 3 38 2 3 6 7 6 ...
$ ar : int 329 329 330 330 7 329 329 329 329 329 ...
$ belopp: num 1531 -229.3 324 -48.9 0 ...
$ datum : int 36976 36976 37287 37287 37961 36976 36976 37236 37236 37281 ...
一意の ID ごとにトランザクションを抽出してループし、一連の計算を行う必要があります。問題は、データセットのサブセット化が遅すぎることです..
R> system.time(
+ sub <- trans[trans$id==15,]
+ )
user system elapsed
7.80 0.55 8.36
R> system.time(
+ sub <- subset(trans, id == 15)
+ )
user system elapsed
8.49 1.05 9.53
このデータセットには約 10m の一意の ID があるため、このようなループには永遠に時間がかかります。どうすれば高速化できるでしょうか?
EDIT 私は「data.tables」、インデックス作成、ソートに手を出しましたが、あまり運がありません..
library(data.table)
trans2 <- as.data.table(trans)
trans2 <- trans2[order(id)]
trans2 <- setkey(trans2, id)
R> system.time(
+ sub <- trans2[trans2$id==15,]
+ )
user system elapsed
7.33 1.08 8.41
R> system.time(
+ sub <- subset(trans2, id == 15)
+ )
user system elapsed
8.66 1.12 9.78
EDIT2すごい。
R> system.time(
+ sub <- trans2[J(15)]
+ )
user system elapsed
0 0 0