我有以下名为 test
的 tibble
:
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
,但这是我的最后一个选择。对我来说困难的部分是重置计数器并重新开始计数。
最佳答案
其中一个 dplyr
和 purrr
的可能性可能是:
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/