【问题标题】:Speeding up data.table SD[,]加速 data.table SD[,]
【发布时间】:2016-07-20 03:33:12
【问题描述】:

我的代码使用下面的 sn-p 相当多,因为我想要按组 group1、group2、group3 和 group4 分组后的最新记录

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

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

【问题讨论】:

  • 你安装了开发版吗?如果我没记错的话,.SD[1L] 最近进行了优化,因此可能仅通过更新就能提高速度

标签: r data.table


【解决方案1】:

使用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 

【讨论】:

  • .SD[1,] 切换到.SD[1L].SD[1] 也很快,如github.com/Rdatatable/data.table/issues/735 所述(不确定是否需要开发版本)。如果我没记错的话,unique(这里的另一个选项)会更慢。
  • 谢谢阿克伦。那行得通。并感谢您的建议也弗兰克
猜你喜欢
  • 2016-08-23
  • 2012-08-22
  • 2023-04-02
  • 2019-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-23
  • 1970-01-01
相关资源
最近更新 更多