如何解决计算没有总时间的时间总和
我有一个带有时间的数据框。我想计算净时间,但要减去并发性。例如,在bob下的df中,两个时间段的时间为12:00至14:00,因此结果显示为120分钟。乔的时间没有重叠,因此结果显示为180分钟。
data.frame (
person=c("bob","joe","rick","bob","joe"),start=c("12:00","13:00","13:30","12:30","16:00"),stop=c("13:00","15:00","14:00","17:00")
)
我将从哪里开始?看来我会先通过for循环计算每行之间的时间差,然后从人的总和中减去净差,但这似乎是一种笨拙的方法。
编辑:对不起,示例输出将类似于:
data.frame (
person=c("bob","rick"),time=c("2:30","3:00","0:30"),)
编辑2: 更真实的数据,以逗号分隔
"BGN","END","Date","Diff"
"2020-09-24 07:19:00","2020-09-24 11:06:00","2020-09-24",227
"2020-09-24 07:25:00","2020-09-24 11:00:00",215
"2020-09-24 08:28:00","2020-09-24 09:30:00",62
"2020-09-24 10:17:00","2020-09-24 11:31:00",74
"2020-09-24 11:40:00","2020-09-24 14:10:00",150
"2020-09-24 11:43:00","2020-09-24 13:25:00",102
"2020-09-24 12:13:00","2020-09-24 15:15:00",182
"2020-09-24 14:14:00","2020-09-24 16:28:00",134
"2020-09-24 14:44:00","2020-09-24 15:14:00",30
"2020-09-24 15:39:00","2020-09-24 16:23:00",44
"2020-09-24 16:41:00","2020-09-24 19:00:00",139
"2020-09-24 16:41:00","2020-09-24 19:41:00",180
"2020-09-24 16:45:00",135
解决方法
也许这有帮助
library(dplyr)
library(lubridate)
df1 %>%
mutate(across(c(start,stop),~ as.POSIXct(.,format = '%H:%M'))) %>%
group_by(person) %>%
summarise(time = seconds_to_period(sum(difftime(stop,start,unit = 'sec'))),time = sprintf('%s:%s',hour(time),minute(time)))
-输出
# A tibble: 3 x 2
# person time
# <chr> <chr>
#1 bob 2:30
#2 joe 3:0
#3 rick 0:30
,
您可以在当前BGN
小于lag(END)
的一组中将时间放在一起,并且每个组中的max(END)
和min(BGN)
之间的差异。最后计算每个人的合并时间。
library(dplyr)
df1 %>%
mutate(across(c(BGN,END),lubridate::ymd_hms)) %>%
group_by(person_name,grp = cumsum(BGN >= lag(END,default = first(END)))) %>%
summarise(time = difftime(max(END),min(BGN),units = 'secs')) %>%
summarise(time = sum(time))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。