for循环中的R data.table非常慢

时间:2016-07-20 09:14:30

标签: r performance for-loop data.table time-series

我有100,000个用户,每个用户都有大约1,000个时间序列值的时间序列,我想为其计算指标。不幸的是,我现有的代码运行速度很慢,我认为主要是由于循环操作而没有充分利用data.table。

我找到了类似问题R: Using for-loop and filter data.table的解决方案,但我不确定如何将其应用于我的任务,这是一个更先进的统计/时间序列问题。我的目标是能够为每个用户运行N次计算,而不仅仅是我在下面做的3次计算(a,b和c)。我担心目前的方法不会很好地扩展。

当前代码大约需要32分钟才能运行10,000人。当我删除na.omit并订购时,我也没有看到任何速度降低。

非常感谢您的帮助!

更新:请参阅“数据”和“x”的详细信息。

  • 数据代表所有客户数据历史记录(每日需求)
  • x是感兴趣的客户列表。

names(data)= c('id''require''service_date'); names(x)= c('id')

m = 100000
h = data.frame(matrix(NA,m,8))
names(h) = c("id", "u", "m1", "m2", "m3", "m3_m1", "m3_m2", "m2_m1")

system.time(
for (i in 1:m){

dt = data.table(na.omit(data[data$id == x$id[i],]))
dt = dt[order(service_date)]$demand

u = floor(length(dt)/3);
a = median((dt[1:u])); b = median(dt[(u+1):(2*u)]) ; c = median(dt[(2*u+1):(3*u)])

h[i,] = data.frame(x$id[i],u,a,b,c,c-b,c-a,b-a)
})

1 个答案:

答案 0 :(得分:0)

很明显,你们仅仅因为你们难以解决而贬低了我的问题。

你是一些专家!我自己去弄清楚了。 :)顺便说一下,我昨天刚刚学习了data.table。

洛尔

你可以通过展示我在原始问题中提到的3个分裂如何做到这一点来赎回你的可信度,因为这只做二进制分裂。

x_dt = data.table(x); data_dt = na.omit(data)
setkey(x_dt,id); setkey(data_dt,id) ;

system.time(data_dt <- data_dt[x_dt][order(id,service_date),])

system.time(x2 <- data_dt[,.(lt = length(demand),md = median(demand)),
           by =.(id, m = service_date < service_date[length(service_date)/2])])