首页 > 解决方案 > 在 data.table 中嵌入聚合函数时,case_when 很慢

问题描述

我正在使用 data.table 来处理具有大量行的数据,但是当我尝试将 case_when 与聚合函数一起使用时,我发现速度明显下降。我发现我可以执行 2 个不同的 data.table 步骤,首先使用我的 case_when 语句创建一个新列,然后执行聚合该变量的第二步,它执行得非常快,但我并不总是想创建初始 data.table 步骤中的变量。有没有更好的方法来使用带有聚合 data.table 步骤的“case_when”类型语句?

这是一个可重现的示例:

library(dplyr)
library(data.table)

df <- data.table('id' = 1:283408,
                 'year' = 2018,
                 'qtr' = sample(x = 1:4,283408,TRUE),
                 'var1' = sample(x = 1:12,size = 283408,TRUE))


##### This approach takes me 66 seconds
start <- proc.time()
df2 = df[,
         list(var2 = max(case_when(var1 <= 3 ~ 3,
                                   var1 <= 6 ~ 6,
                                   var1 <= 9 ~ 9,
                                   TRUE ~ 12))),
         by = list(id,year,qtr)]
proc.time() - start

##### This approach takes .11 seconds
start <- proc.time()
df[,var2 := case_when(var1 <= 3 ~ 3,
                      var1 <= 6 ~ 6,
                      var1 <= 9 ~ 9,
                      TRUE ~ 12)]
df2 = df[,
         list(var2 = max(var2)),
         by = list(id,year,qtr)]
proc.time() - start

标签: rdata.table

解决方案


推荐阅读