【发布时间】:2020-05-31 23:51:45
【问题描述】:
我正在尝试计算由其他两列聚合的大型 data.table(约 30M 行)中列的滚动平均值。 滚动平均值应仅包括前面的 N 行值,而不是行值本身。 为此,我必须根据 frollmean 函数定义自己的滚动平均函数。 (N=3) 将函数应用于列真的很慢,变得相当无用。
这里是示例数据:
require(data.table)
DT <- data.table(ID=c('A', 'A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C')
, value_type =c('type 1', 'type 1','type 2','type 1','type 2','type 2','type 1','type 1','type 2','type 1','type 1','type 1')
, value=c(1,4,7,2,3,5,1,6,8,2,2,3))
DT
ID value_type value
1: A type 1 1
2: A type 1 4
3: A type 2 7
4: A type 1 2
5: A type 2 3
6: A type 2 5
7: B type 1 1
8: B type 1 6
9: B type 2 8
10: C type 1 2
11: C type 1 2
12: C type 1 3
#this is the customised rolling function
lrollmean<-function(x){
head(frollmean(c(NA,NA,NA,x), n = 3, fill = NA, algo ="exact", align="right", na.rm = TRUE)[-(1:2)], -1)
}
> DT[, roll_mean := lrollmean(value), by=.(ID, value_type)]
> DT
ID value_type value roll_mean
1: A type 1 1 NaN
2: A type 1 4 1.0
3: A type 2 7 NaN
4: A type 1 2 2.5
5: A type 2 3 7.0
6: A type 2 5 5.0
7: B type 1 1 NaN
8: B type 1 6 1.0
9: B type 2 8 NaN
10: C type 1 2 NaN
11: C type 1 2 2.0
12: C type 1 3 2.0
此操作需要 30 多分钟!我有一台合理的机器,有足够的内存,我觉得长时间的操作与我的代码而不是机器有关。
【问题讨论】:
-
你有很多组吗?例如在 30M 行中,有多少组?你真的需要
algo="exact"吗? -
数据有大约 800,000 个唯一 ID。不,我不相信我真的需要 algo = "exact" :)
-
我将 algo="exact" 更改为 algo="fast" 并且速度要快得多!
-
如果您真的需要精确,那么在有很多组的情况下切换到 1 个线程可能会有所帮助。
标签: r data.table mean rolling-computation