r - 达到阈值时 dplyr 重置计数器

标签 r dplyr tidyr purrr

我有以下名为 testtibble:

  datetime                volume
  <dttm>                   <dbl>
  2020-08-25 09:30:00.000      0
  2020-08-25 09:30:12.000    107
  2020-08-25 09:30:50.000    221
  2020-08-25 09:30:50.000    132
  2020-08-25 09:30:50.000    148
  2020-08-25 09:30:50.000    100
  2020-08-25 09:30:50.000    100
  2020-08-25 09:30:58.000    100
  2020-08-25 09:31:56.000    157
  2020-08-25 09:32:36.000    288
  2020-08-25 09:32:36.000    100
  2020-08-25 09:33:10.000    235
  2020-08-25 09:33:23.000    182
  2020-08-25 09:33:44.000    218
  2020-08-25 09:33:44.000    179
  2020-08-25 09:34:18.000    318
  2020-08-25 09:34:27.000    101
  2020-08-25 09:34:27.000    157
  2020-08-25 09:34:27.000    200
  2020-08-25 09:34:27.000    114

我想计算达到阈值时的累积时间差(甚至只是时间戳相同的行数)。一旦达到/超过阈值,我将计数器重置为 0,并从该点开始再次累加。

例如,如果我的阈值是300,我从行1累加到行3,我会得到0 +107+221=328,我现在选择:

  • 保留该行的时间戳,
  • 计算第 1 行到 3 行的时间差,
  • 或者计算行数,直到达到阈值

以上任何一项都可以达到目的,最好的选择是保留时间戳。

下一步是重置计数器(目前保持在 328)并从第 4 行重新开始计数;从行 4 到行 7 我累积了 148+100+100=348,我会再次保留时间戳(例如)。然后我会再次重置计数器并继续前进。

我尝试使用 dplyr 或一般在 tidyverse 中执行此操作,但我无法提出合理的解决方案。我认为仅仅通过管道与 dplyr 没有办法做到这一点。

我认为我可以使用for-loop,但这是我的最后一个选择。对我来说困难的部分是重置计数器并重新开始计数。

最佳答案

其中一个 dplyrpurrr 的可能性可能是:

df %>%
 group_by(group_id = cumsum(c(0, diff(accumulate(volume, ~ if_else(.x >= 300, .y, .x + .y))) < 0))) %>%
 summarise(timestamp_first = first(datetime),
           timestamp_last = last(datetime),
           time_diff = last(datetime) - first(datetime),
           n_rows = n(),
           volume_sum = sum(volume))

  group_id timestamp_first     timestamp_last      time_diff n_rows volume_sum
     <dbl> <dttm>              <dttm>              <drtn>     <int>      <int>
1        0 2020-08-25 09:30:00 2020-08-25 09:30:50 50 secs        3        328
2        1 2020-08-25 09:30:50 2020-08-25 09:30:50  0 secs        3        380
3        2 2020-08-25 09:30:50 2020-08-25 09:31:56 66 secs        3        357
4        3 2020-08-25 09:32:36 2020-08-25 09:32:36  0 secs        2        388
5        4 2020-08-25 09:33:10 2020-08-25 09:33:23 13 secs        2        417
6        5 2020-08-25 09:33:44 2020-08-25 09:33:44  0 secs        2        397
7        6 2020-08-25 09:34:18 2020-08-25 09:34:18  0 secs        1        318
8        7 2020-08-25 09:34:27 2020-08-25 09:34:27  0 secs        3        458
9        8 2020-08-25 09:34:27 2020-08-25 09:34:27  0 secs        1        114

关于r - 达到阈值时 dplyr 重置计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63817251/

相关文章:

r - 如何在 Shiny eventReactive 处理程序中监听多个事件表达式

r - 转换覆盖图中轨迹的距离

r - R 中 Rmpfr 的科学记数法

r - 按相对于因子列的最小值过滤行

r - 用R中的tidyverse按组完成整数序列

r - 如何绘制联锁环?

r 使用 rms ols 函数处理多个对象和置信区间

r - 使用 R 中另一个数据帧的日期时间过滤和汇总来自一个数据帧的数据

r - 如何检查日期是否在 R 中的间隔列表内?

r - 在旋转 long 之前从常见的 colname 结尾创建新变量