【发布时间】:2013-01-03 13:09:17
【问题描述】:
我有这个金融交易数据集,它相当大但小到足以保存在内存中..
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,因此这样的循环将持续很长时间,有什么想法可以加快速度吗?
编辑 我已经涉足了“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
【问题讨论】:
-
您能描述一下您对
data.tables 的尝试以及您遇到问题的地方吗? -
@BenBarnes 当然,我尝试将 data.frame 转换为
data.table,对其进行排序并使用setkey()函数来索引 id i> 列。这根本没有降低子集时间.. -
你还在使用循环吗?
data.table的,by参数到[会快得多,我认为:stackoverflow.com/questions/11279304/… -
如果您要转换为
data.table并使用setkey,则无需额外进行排序。此外,对于子集,请尝试(使用您的键控 data.table 命名,例如,transDT)transDT[J(15)]。还请考虑编辑您的问题以包含您使用的 data.table 代码。
标签: r