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

如何在R中计算活动监测数据状态切换前的持续时长及周期均值

解决思路与R代码实现

首先补全可直接运行的示例数据构造代码,后续计算基于tidyverse+data.table工具链实现,核心用rleid()函数识别连续相同的状态分组:

# 加载依赖包
library(tidyverse)
library(data.table)

# 构造示例数据
timeofday<-c("8:00","8:05","8:10","8:20","8:25")
activity<-c(1250,1650,200,100,40)
state<-c("awake","awake","sleep","sleep","sleep")
df <- tibble(timeofday,state,activity)

1. 计算连续状态周期时长

# 先把时间转为标准时间格式,避免后续计算出错
df <- df %>%
  mutate(timeofday = as.POSIXct(timeofday, format = "%H:%M"))

# 生成连续状态分组,计算每个周期的起止时间和总时长
df_period <- df %>%
  # 为连续相同的state生成唯一分组ID
  mutate(period_id = rleid(state)) %>%
  group_by(period_id, state) %>%
  summarise(
    # 周期开始时间(第一个时段的起始点)
    start_time = format(first(timeofday), "%H:%M"),
    # 周期结束时间(最后一个时段的结束点,每个时段5分钟所以加5分钟)
    end_time = format(last(timeofday) + 5*60, "%H:%M"),
    # 周期总时长,单位:分钟
    duration_mins = n() * 5,
    .groups = "drop"
  )

运行后得到的结果如下,完全匹配需求示例:

period_idstatestart_timeend_timeduration_mins
1awake08:0008:1010
2sleep08:1008:3015

2. 统计不同状态的平均周期时长

基于上面得到的周期表直接分组聚合即可:

df_avg <- df_period %>%
  group_by(state) %>%
  summarise(
    # 对应状态的周期总数量
    period_count = n(),
    # 平均周期时长,单位:分钟
    avg_duration_mins = mean(duration_mins)
  )

内容的提问来源于stack exchange,提问作者mferrans98

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:39:04