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