加速data.table SD [,]

时间:2016-07-20 03:33:12

标签: r data.table

我的代码使用下面的代码片段,因为我希望在按组group1,group2,group3和group4进行分组后获得最新记录

dt[order(-date), .SD[1,], by=.(group1, group2, group3, group4)]

问题是代码非常慢。有更快的替代方案吗?

1 个答案:

答案 0 :(得分:2)

使用head可以提高速度。

dt[order(-date), head(.SD, 1), by=.(group1, group2, group3, group4)]

或另一个选项.I可以显着加快这个过程

dt[dt[order(-date), .I[1L], by=.(group1, group2, group3, group4)]$V1]

基准

set.seed(234)
dt <- data.table(group1 = sample(letters, 1e6, replace=TRUE),
              group2 = sample(letters, 1e6, replace=TRUE),
              group3 = sample(1:10, 1e6, replace=TRUE), 
              group4 = sample(5:15, 1e6, replace=TRUE),
              date = sample(1:30, 1e6, replace=TRUE), 
              value = rnorm(1e6))
system.time(dt[order(-date), .SD[1,], by=.(group1, group2, group3, group4)])
#   user  system elapsed 
#  29.63   15.65   46.17 

 system.time(dt[order(-date), head(.SD, 1), by=.(group1, group2, group3, group4)])
 #  user  system elapsed 
 #  0.22    0.00    0.14 
 system.time(dt[dt[order(-date), .I[1L], by=.(group1, group2, group3, group4)]$V1])
 #  user  system elapsed 
 #  0.23    0.02    0.15 

另外,来自@Frank的建议

system.time(dt[order(-date), .SD[1L], by=.(group1, group2, group3, group4)])
#   user  system elapsed 
#  0.16    0.05    0.16