如何在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_id | state | start_time | end_time | duration_mins |
|---|---|---|---|---|
| 1 | awake | 08:00 | 08:10 | 10 |
| 2 | sleep | 08:10 | 08:30 | 15 |
2. 统计不同状态的平均周期时长
基于上面得到的周期表直接分组聚合即可:
df_avg <- df_period %>% group_by(state) %>% summarise( # 对应状态的周期总数量 period_count = n(), # 平均周期时长,单位:分钟 avg_duration_mins = mean(duration_mins) )
内容的提问来源于stack exchange,提问作者mferrans98
相关产品推荐
相关产品推荐

