我正在使用data.table来处理具有很多行的数据,但是当我尝试通过聚合函数使用case_w时,我看到了明显的减速。我发现我可以做2个不同的data.table步骤,首先使用case_when语句创建一个新列,然后进行聚合该变量的第二步,并且执行速度非常快,但是我并不总是想要创建初始data.table步骤中的变量。是否有更好的方法将“ case_when”类型语句与聚合data.table步骤一起使用?
以下是可重现的示例:
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