【发布时间】:2021-12-18 21:41:58
【问题描述】:
我正在尝试了解如何创建一个变量来总结多个日期的观察结果。
library(data.table)
library(lubridate)
library(magrittr)
sample <- data.table(start = c("2018-12-22 23:00:00",
"2018-12-23 06:00:00",
"2018-12-22 06:00:00",
"2018-12-23 06:00:00"),
end = c("2018-12-23 06:00:00",
"2018-12-23 13:00:00",
"2018-12-23 12:00:00",
"2018-12-24 01:00:00"),
store = c("A", "A", "B", "B"))
sample[, start:= ymd_hms(start)]
sample[, end := ymd_hms(end)]
sample
> sample
start end store
1: 2018-12-22 23:00:00 2018-12-23 06:00:00 A
2: 2018-12-23 06:00:00 2018-12-23 13:00:00 A
3: 2018-12-22 06:00:00 2018-12-23 12:00:00 B
4: 2018-12-23 06:00:00 2018-12-24 01:00:00 B
这里,sample 是每个商店使用的“轮班”时间卡。我们看到商店 A 有两个观察值,每个观察值都有一个开始时间和结束时间。如果跨日期没有“出血”(例如,第一次观察从 2018 年 12 月 22 日开始,到 2018 年 12 月 23 日结束),我会简单地减去开始时间和结束时间,然后在商店之间求和以获得总金额每个商店使用的分钟数。比如:
worked_mins <- sample %>%
.[, date := ymd(substr(start,1,10))] %>%
.[, minutes := end - start] %>%
.[, .(worked_mins = sum(minutes)), by = .(store,date)]
但是,我正在尝试了解如何最好地计算多天(甚至可能 >=2 天)轮班重叠时的分钟数。
根据上述,所需的输出将是:
worked_mins = data.table(store = c("A","A", "B", "B", "B"),
date = c("2018-12-22", "2018-12-23",
"2018-12-22", "2018-12-23",
"2018-12-24"),
worked_mins = c(1, 13, 18, 30, 1))
> worked_mins
store date worked_mins
1: A 2018-12-22 1
2: A 2018-12-23 13
3: B 2018-12-22 18
4: B 2018-12-23 30
5: B 2018-12-24 1
谢谢!
【问题讨论】:
-
刚刚做了,谢谢。但是该代码不适用于我想要的输出。
-
是的。对不起。它现在可以工作了,但是这段代码的问题是它没有捕捉到我上面描述的跨日期的“出血”。
-
您显示了
worked_mins的名称,但差异实际上是按小时 的顺序排列的,我看不到这里的分钟数。 -
@r2evans 我的错误。那太草率了。我道歉。我只是放了那段代码来表明我的意图。但你是对的,它应该以分钟为单位,因为开始和结束时间也可以用小数小时写。
-
别担心,确保我理解正确。
标签: r dplyr data.table lubridate