我有一个数据框如下:
tab <- data.frame(Behav = c("Rest","Eat","Eat"),
Behav.start= c("14:10:40","14:13:25","17:35:00"),
Behav.end = c("14:13:24","17:31:05","17:37:25"),
Behav.dur.s = c("164","19060","145"))
Behav Behav.start Behav.end Behav.dur.s
Rest 14:10:40 14:13:24 164
Eat 14:13:25 17:31:05 11860
Eat 17:35:00 17:37:25 145
注: 'Behav.dur.s'='Behav.start'和'Behav.end'之间的时间间隔(以秒为单位)
我想计算每小时的时间预算,换句话说,我想计算一个人在每个1小时的间隔期间休息,吃饭等的时间。
然后,我尝试(但失败了......)重新构建我的初始数据框选项卡以获取新的数据框,例如行为持续超过一小时的行(Behav.dur.s> 3600)被替换为n'重复'具有给定行为的行持续1小时间隔,更新Behav.start,Behav.end和Behav.dur.s
Behav Behav.start Behav.end Behav.dur.s
Rest 14:10:40 14:13:24 164
Eat 14:13:25 15:00:00 2795
Eat 15:00:00 16:00:00 3600
Eat 16:00:00 17:00:00 3600
Eat 17:00:00 17:31:05 1865
Eat 17:35:00 17:37:25 145
然后,我将能够计算每小时的时间预算。
我非常感谢你的帮助,非常感谢你!
考虑以下步骤,以下假设在一天中的所有24小时内使用交叉连接,然后将子集设置为特定持续时间,最后重新计算开始/结束点。
HH:MM
的字符串格式;00:00
到23:59
一天)。否则按天和rbind
分开;# CONVERT TIMES TO POSIXct TYPES
tab <- within(tab, {
Behav.start = as.POSIXct(Behav.start, tz="GMT", format="%H:%M:%S")
Behav.end = as.POSIXct(Behav.end, tz="GMT", format="%H:%M:%S")
})
# BUILD DF OF ALL 24 HOURS DURATIONS FOR CURRENT DATE
hours_df <- data.frame(start_hour = as.POSIXlt(as.POSIXct(Sys.Date()) + c(0:23)*60*60),
end_hour = as.POSIXlt(as.POSIXct(Sys.Date()) + c(1:24)*60*60))
mdf <- merge(tab, hours_df, all=TRUE)
sdf <- subset(mdf, Behav.start <= end_hour & Behav.end >= start_hour)
final_df <- within(sdf, {
final_start <- as.POSIXct(ifelse(Behav.start > start_hour, Behav.start, start_hour),
tz="GMT", origin="1970-01-01")
final_end <- as.POSIXct(ifelse(Behav.end < end_hour, Behav.end, end_hour),
tz="GMT", origin="1970-01-01")
final_dur <- as.numeric(difftime(final_end, final_start, units="secs"))
rm(Behav.start, Behav.end, start_hour, end_hour, Behav.dur.s)
})[c("Behav", "final_start", "final_end", "final_dur")]
# CONVERT DATE/TIME TO STRING TIME
final_df <- data.frame(within(final_df, {
final_start <- format(final_start, format="%H:%M:%S")
final_end <- format(final_end, format="%H:%M:%S")
}), row.names = NULL)
final_df
# Behav final_start final_end final_dur
# 1 Rest 14:10:40 14:13:24 164
# 2 Eat 14:13:25 15:00:00 2795
# 3 Eat 15:00:00 16:00:00 3600
# 4 Eat 16:00:00 17:00:00 3600
# 5 Eat 17:00:00 17:31:05 1865
# 6 Eat 17:35:00 17:37:25 145