R-加速与data.table子集相关的计算

时间:2014-07-21 02:43:00

标签: r performance function data.table subset

需要关于加速以下案例的帮助:

对于1.3M订单,我有大约850万行订单历史记录。我需要计算每个订单两步之间的时间。我使用如下计算:

History[, time_to_next_status:=
                      get_time_to_next_step(id_sales_order_item_status_history,
                                            id_sales_order_item, History_subset),
    by='id_sales_order_item_status_history']

在上面的代码中:

  • id_sales_order_item - 销售订单商品的ID - 有多个历史记录具有相同的id_sales_order_item
  • id_sales_order_item_status_history - 行的ID
  • History_subset 历史记录的子集,其中只包含计算中需要的3列[id_sales_order_item_status_history, id_sales_order_item, created_at]
  • created_at 是创建历史记录的时间

函数 get_time_to_next_step 定义如下

get_time_to_next_step <- function(id_sales_order_item_status_history, filter_by,
                                  dataSet){

   dataSet <- dataSet %.% filter(id_sales_order_item == filter_by)

   index <- match(currentId, dataSet$id_sales_order_item_status_history)

   time_to_next_status <- dataSet[index + 1, created_at] - dataSet[index, created_at]

   time_to_next_status
}

问题是需要15分钟来运行历史记录的10k记录。因此,完成计算需要大约9天的时间。无论如何,我可以在没有将数据分成多个子集的情况下将其固定下来吗?

1 个答案:

答案 0 :(得分:2)

我会开枪。难道你不能尝试这样的事情..

History[ , Index := 1:.N, by= id_sales_order_item]
History[ , time_to_next_status := created_at[Index+1]-created_at[Index], by= id_sales_order_item]

我认为这会非常快。