【问题标题】:split in Blocks data and obtain max/min in R拆分块数据并在 R 中获得最大/最小值
【发布时间】:2020-04-20 21:24:48
【问题描述】:

目前我有一个时间序列,其中 y 值 = 商品数量,x 值 = 日期 + 购买时间(例如,在 2020 年 1 月 1 日 13:45 有人购买了 5 件商品)。我的数据看起来像下面的图像加上一些噪音(但让我们想象它看起来像一个方形信号):

但是,每个矩形的宽度可能会有所不同。我想要做的是在存在购买时获得 x 轴上的最小值和最大值(例如,在图中可能存在值 0.2 和 0.4 之间的购买,所以这两个值将是我的最小值和最大值,但在我的情况下是日期/时间)。但是在这种情况下,会有多个长度不同的块,我只想提取该块的最小值/最大值,但由于我是 R 新手,所以我没有想到这样做的方法。有没有人可以引导我找到解决此问题的可能方法?

一个非常简单的例子如下:

purchase.dates <- c("01/01/2020 20:00", "01/01/2020 20:10", "01/01/2020 20:22", ..., "01/01/2020 23:59", "01/02/2020 00:01", "01/02/2020 00:15", "01/02/2020 08:00", "01/02/2020 08:03", "01/02/2020 08:15")

从这个例子中我想获得 2 个区块(实际上,当我考虑更多天时,我希望得到更多的区块,但在这种情况下只有 2 个不同的天):

block1 = c("01/01/2020 20:00", "01/01/2020 20:10", "01/01/2020 20:22", ..., "01/01/2020 23:59", "01/02/2020 00:01", "01/02/2020 00:15")

block2 = c("01/02/2020 08:00", "01/02/2020 08:03", "01/02/2020 08:15")

【问题讨论】:

  • 你能展示一个可重复的小例子和预期的输出
  • @akrun,感谢您的观察。我忘了包括一个我想要的玩具示例
  • 我认为rleid 会成为你的朋友

标签: r split time-series


【解决方案1】:

为此,您需要指定何时开始新的购买块。我的建议是定义两个后续购买之间的间隔长度以开始一个新区块。

这可以使用data.table 来完成,例如

library(data.table)
# create sample data (as posted by the OP)
DT <- data.table(purchase.dates = c(
  "01/01/2020 20:00",
  "01/01/2020 20:10",
  "01/01/2020 20:22",
  "01/01/2020 23:59",
  "01/02/2020 00:01",
  "01/02/2020 00:15",
  "01/02/2020 08:00",
  "01/02/2020 08:03",
  "01/02/2020 08:15"))
# coerce to numeric date time
DT[, purchase.dates := lubridate::mdy_hm(purchase.dates)] 

# define length of gap between blocks (in minutes)
min_gap = 6*60
DT[, .(block.start = min(purchase.dates), block.end = max(purchase.dates)),
   by = .(block_id = cumsum(c(TRUE, as.numeric(diff(purchase.dates), units = "mins") >= min_gap)))]

返回预期的两个块

   block_id         block.start           block.end
1:        1 2020-01-01 20:00:00 2020-01-02 00:15:00
2:        2 2020-01-02 08:00:00 2020-01-02 08:15:00

现在,您可以更改 min_gap 以找出最适合您的潜在问题的方法。

例如,使用min_gap &lt;- 120,您将获得 3 个区块:

   block_id         block.start           block.end
1:        1 2020-01-01 20:00:00 2020-01-01 20:22:00
2:        2 2020-01-01 23:59:00 2020-01-02 00:15:00
3:        3 2020-01-02 08:00:00 2020-01-02 08:15:00

因为 20:22 到 23:59 之间没有购买。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 1970-01-01
    • 2013-06-05
    • 2015-12-30
    • 2018-10-22
    • 2021-04-14
    • 2019-01-16
    相关资源
    最近更新 更多