如何计算数据集中Auto-grooming行为的总持续时长?
计算数据集中指定行为的总持续时长
解决步骤:
- 将时间列转换为可计算的时间类型:当前
Time列是格式化后的字符串,需转回POSIXct类型才能进行时间差计算。 - 生成下一个行为的时间列:用
lead()函数获取每行的下一个时间值,作为当前行为的结束时间。 - 计算单条行为的持续时长:通过下一个时间减去当前时间,得到每条行为的持续秒数。
- 筛选目标行为并求和:过滤出"Auto-grooming"的记录,将对应时长相加得到总时长。
完整代码实现:
# 加载dplyr包(未安装先执行 install.packages("dplyr")) library(dplyr) # 原数据准备 hours <- c("10:44:40", "10:45:00", "10:45:30", "10:45:38", "10:45:50") horas_preparadas <- as.POSIXct(hours, format = "%H:%M:%S") formatted_time <- format(horas_preparadas, format = "%H:%M:%S") prueba <- data.frame( Id = c(1, 1, 1, 1, 1), Obs = as.factor(c("Mike", "Mike", "Mike", "Mike", "Mike")), Behavior = c( "Auto-grooming", "Self-Scratch", "Grunt", "Auto-grooming", "Self-Scratch" ), Time = formatted_time ) # 处理时间计算 prueba_processed <- prueba %>% mutate(Time = as.POSIXct(Time, format = "%H:%M:%S")) %>% mutate(next_time = lead(Time)) %>% mutate(duration_sec = as.numeric(difftime(next_time, Time, units = "secs"))) # 计算Auto-grooming的总时长 total_duration <- prueba_processed %>% filter(Behavior == "Auto-grooming") %>% summarise(total_sec = sum(duration_sec, na.rm = TRUE)) print(total_duration)
结果说明:
运行代码后可得Auto-grooming的总持续时长为22秒:
- 首次
Auto-grooming从10:44:40到10:45:00,持续20秒 - 第二次
Auto-grooming从10:45:38到10:45:50,持续12秒 - 两者相加总时长为22秒
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

