如何统计tibble中clean velocity为0的时长并新增period stopped列
实现方案
使用R的tidyverse工具链可以快速实现需求,核心逻辑是对连续的0值序列分组后计算时长:
前置依赖
确保安装dplyr 1.1.0及以上版本(内置consecutive_id函数用于连续状态分组),低于该版本可以用data.table包的rleid函数替代。
完整代码
library(tidyverse) # 构造你的示例数据 df <- tibble( time = c(2.51,3.55,4.56,5.61,6.65,7.69,8.74,9.78,10.8,11.9,12.9,14.0,15,16.0,17.1), distance = c(0,0,0.17,0.68,1.36,1.87,2.54,2.88,2.88,2.88,2.88,2.88,3.22,4.07,4.75), slope = c(0,0.168,0.486,0.654,0.490,0.638,0.327,0,0,0,0,0.324,0.817,0.654,0.810), `rolling velocity avg` = c(0.164,0.327,0.450,0.567,0.527,0.364,0.241,0.0817,0,0.0810,0.285,0.449,0.651,0.731,0.649), `clean velocity` = c(0,0.327,0.450,0.567,0.527,0.364,0.241,0,0,0,0.285,0.449,0.651,0.731,0.649) ) # 核心处理逻辑 df_result <- df %>% # 为每一段连续的0/非0序列生成唯一分组ID mutate(state_grp = consecutive_id(`clean velocity` == 0)) %>% # 按分组聚合计算 group_by(state_grp) %>% mutate( `period stopped` = case_when( # 仅针对全组都是0值的分组,在组最后一行写入时间差 all(`clean velocity` == 0) & row_number() == n() ~ max(time) - min(time), # 其余情况返回NA .default = NA_real_ ) ) %>% ungroup() %>% # 移除临时分组列 select(-state_grp)
结果说明
- 第1行是独立的0值段,
period stopped值为0(同一段仅一行,时间差为0) - 第8-10行是连续0值段,第10行的
period stopped值为11.9 - 9.78 = 2.12,符合需求 - 如需统计总停止时长,直接执行
sum(df_result$period stopped, na.rm = TRUE)即可 - 车轮滚动时长 = 总观测时长(
max(df$time) - min(df$time)) - 总停止时长
低版本dplyr兼容方案
如果你的dplyr版本低于1.1.0,替换分组ID生成逻辑即可:
library(data.table) df_result <- df %>% mutate(state_grp = rleid(`clean velocity` == 0)) %>% # 后续逻辑和上面完全一致 group_by(state_grp) %>% mutate( `period stopped` = case_when( all(`clean velocity` == 0) & row_number() == n() ~ max(time) - min(time), .default = NA_real_ ) ) %>% ungroup() %>% select(-state_grp)
内容的提问来源于stack exchange,提问作者JJB
相关产品推荐
相关产品推荐

