达到阈值时,dplyr重置计数器

如何解决达到阈值时,dplyr重置计数器

我有以下称为tibble的{​​{1}}:

test

我想计算达到 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,然后再次从该点开始累积。

例如,如果我的volume是300,则从行threshold到行1累积,我得到3,我现在选择: / p>

  • 保留该行的时间戳,
  • 计算从第0+107+221=328行到第1行的时间差,
  • 或计算直到达到阈值为止的行数

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

下一步是重置计数器(当前停留在3处),并从行328开始重新计数;从第4行到第4行,我累积了7,我将再次保留时间戳记(例如)。然后,我再次重置计数器,然后再次继续。

我尝试使用148+100+100=348或通常在dplyr中进行此操作,但是我无法提出合理的解决方案。我认为没有办法仅将管道与dplyr一起使用。

我认为我可以接受tidyverse,但这是我的最后选择。对我来说,最困难的部分是重置计数器并重新开始计数。

解决方法

一种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
,

这可能会让您前进。它利用MESS包,尤其是天才cumsumbinning函数。

样本数据

library( data.table )
library( MESS )
test <- data.table::fread( "datetime                volume
2020-08-25T09:30:00.000      0
2020-08-25T09:30:12.000    107
2020-08-25T09:30:50.000    221
2020-08-25T09:30:50.000    132
2020-08-25T09:30:50.000    148
2020-08-25T09:30:50.000    100
2020-08-25T09:30:50.000    100
2020-08-25T09:30:58.000    100
2020-08-25T09:31:56.000    157
2020-08-25T09:32:36.000    288
2020-08-25T09:32:36.000    100
2020-08-25T09:33:10.000    235
2020-08-25T09:33:23.000    182
2020-08-25T09:33:44.000    218
2020-08-25T09:33:44.000    179
2020-08-25T09:34:18.000    318
2020-08-25T09:34:27.000    101
2020-08-25T09:34:27.000    157
2020-08-25T09:34:27.000    200
2020-08-25T09:34:27.000    114")

test[,datetime := as.POSIXct( datetime,format = "%Y-%m-%dT%H:%M:%OS") ]

代码

采用data.table语法,但可以很容易地集成到任何tidyverse或baseR解决方案中

#create groups based on cumsum with threshold of 300
test[,group_id := MESS::cumsumbinning( volume,threshold = 300,cutwhenpassed = TRUE )]

#                datetime volume group_id
#  1: 2020-08-25 09:30:00      0        1
#  2: 2020-08-25 09:30:12    107        1
#  3: 2020-08-25 09:30:50    221        1
#  4: 2020-08-25 09:30:50    132        2
#  5: 2020-08-25 09:30:50    148        2
#  6: 2020-08-25 09:30:50    100        2
#  7: 2020-08-25 09:30:50    100        3
#  8: 2020-08-25 09:30:58    100        3
#  9: 2020-08-25 09:31:56    157        3
# 10: 2020-08-25 09:32:36    288        4
# 11: 2020-08-25 09:32:36    100        4
# 12: 2020-08-25 09:33:10    235        5
# 13: 2020-08-25 09:33:23    182        5
# 14: 2020-08-25 09:33:44    218        6
# 15: 2020-08-25 09:33:44    179        6
# 16: 2020-08-25 09:34:18    318        7
# 17: 2020-08-25 09:34:27    101        8
# 18: 2020-08-25 09:34:27    157        8
# 19: 2020-08-25 09:34:27    200        8
# 20: 2020-08-25 09:34:27    114        9

现在分组完成了,总结应该很容易。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-