gpt4 book ai didi

R:data.table 与合并(聚合())性能

转载 作者:行者123 更新时间:2023-12-04 14:25:33 27 4
gpt4 key购买 nike

或者更笼统地说,它是 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在这个特定的应用程序中不能很好地扩展。

有没有更好的“数据表方式”来处理此类任务?

最佳答案

我们可以使用 .I获取行索引并根据该索引对行进行子集。它应该更快。

system.time(df[df[,.I[d == max(d)], by = c]$V1])
# user system elapsed
# 5.00 0.09 5.30

@Heroka 的解决方案
system.time(df[,is_max:=d==max(d), by = c][is_max==T,])
# user system elapsed
# 5.06 0.00 5.12
aggregate我机器上的方法给出
system.time(merge(aggregate(d ~ c, data = df, max), df))
# user system elapsed
# 48.62 1.00 50.76

.SD选项
system.time(df[,.SD[d == max(d)], by = c])
# user system elapsed
# 151.13 0.40 156.57

使用 data.table加入
system.time(df[df[, list(d=max(d)) , c], on=c('c', 'd')])
# user system elapsed
# 0.58 0.01 0.60

如果我们看一下 merge/aggregate 之间的比较和 == ,它们是不同的功能。通常, aggregate/mergedata.table 的对应连接相比,方法会更慢.但是,我们使用的是 ==比较每一行(需要一些时间)以及 .SD用于子集化(与用于行索引的 .I 相比,效率也相对较低)。 .SD还有 [.data.table的开销.

关于R:data.table 与合并(聚合())性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35223311/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com