我的代码使用下面的代码片段,因为我希望在按组group1,group2,group3和group4进行分组后获得最新记录
dt[order(-date), .SD[1,], by=.(group1, group2, group3, group4)]
问题是代码非常慢。有更快的替代方案吗?
答案 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