【问题标题】:R- Speed up calculation related with subset of data.tableR-加快与data.table子集相关的计算
【发布时间】:2014-09-11 11:33:45
【问题描述】:

需要帮助加快以下情况:

我有 130 万个订单的大约 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_subsetHistory 的子集,其中仅包含计算所需的 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
}

问题是运行大约 10k 条历史记录需要 15 分钟。因此,完成计算最多需要 9 天。无论如何我可以在不将数据分解为多个子集的情况下解决这个问题吗?

【问题讨论】:

  • 您能否发布一些示例输入/所需的输出?我认为这将是最有帮助的。

标签: r performance function data.table subset


【解决方案1】:

我会拍的。你能不能试试这样的..

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]

我认为这会很快。

【讨论】:

  • 谢谢 - 我正准备将“current_id”编辑为“id_sales_order_item”。它非常快。只需运行,它在 5 分钟内达到 1M 行
  • 有趣...我有点惊讶它仍然那么慢。也许是 lag 操作,然后减法会更快。但我并不积极。
  • 为什么不简单地History[, time_to_next_status := c(NA,diff(created_at)), by = id_sales_order_item]
  • @Mike,我跟踪错了,因为数据按id_sales_order_item 分组,当它达到1M 计数时,意味着它已经超过1M id_sales_order_item,大约是6~7M 的历史记录.我不知道在这种情况下如何滞后帮助。谢谢 mnel - 我刚刚测试了你的公式,它们速度很快 - 认为结果不是我想要的,因为现在它是 time_since_last_status
猜你喜欢
  • 1970-01-01
  • 2013-07-03
  • 1970-01-01
  • 2014-04-25
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多