You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 09:12:03