或者更一般地说,它是DT[,.SD[...],by=...]
versus merge(aggregate(...))
.
话不多说,这里是数据和示例:
set.seed(5141)
size = 1e6
df <- data.table(a = rnorm(size),
b = paste0(sample(letters, size, T),
sample(letters, size, T),
sample(letters, size, T)),
c = sample(1:(size/10), size, T),
d = sample(seq.Date(as.Date("2015-01-01"),
as.Date("2015-05-31"), by="day"), size, T))
system.time(df[,.SD[d == max(d)], by = c])
# user system elapsed
# 50.89 0.00 51.00
system.time(merge(aggregate(d ~ c, data = df, max), df))
# user system elapsed
# 18.24 0.20 18.45
通常没有问题data.table
性能,我对这个特殊的例子感到惊讶。我必须通过仅获取某些事件类型的最新(可以是同时)发生的事件来对相当大的数据帧进行子集(聚合)。并保留这些特定事件的其余相关数据。然而,似乎.SD
在此特定应用程序中不能很好地扩展。
有没有更好的“数据表方式”来处理此类任务?