【发布时间】:2016-02-05 20:26:38
【问题描述】:
或者更笼统地说,是 DT[,.SD[...],by=...] 与 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 在这个特定的应用程序中似乎不能很好地扩展。
有没有更好的“数据表方式”来处理这类任务?
【问题讨论】:
-
有趣的是,
df[,is_max:=d==max(d), by = c][is_max==T,]在我的机器上运行得非常快。 -
这似乎是迄今为止最快的解决方案。是否可以在不创建额外列的情况下做同样的事情?
-
我不知道,你可以随时删除它
df[,is_max:=d==max(d), by = c][is_max==T,][, is_max:=NULL,]。 @Akrun 提供的 join-solution 是迄今为止最快的。
标签: r data.table