Я пытаюсь найти первую запись «ON», которая происходит между 03:00:00 и 03:00:00 следующего дня для каждой комбинации даты и идентификатора (с 3:00 до следующего дня 3:00).
#dummy data
df <- tibble::tribble(
~id, ~code, ~start_day, ~hhmmss, ~end_time,
"7050-1", "ON", 20200227, "000000", 20200227002400,
"7050-1", "SNOOZE", 20200227, "002400", 20200227003400,
"7050-1", "OFF", 20200227, "003400", 20200227003545,
"7050-1", "ON", 20200227, "003545", 20200227004815,
"7050-1", "SLP", 20200227, "004815", 20200227021400,
"7050-1", "SLP", 20200227, "021400", 20200227073415,
"7050-1", "ON", 20200227, "073415", 20200227164515,
"7050-1", "ON", 20200228, "025936", 20200227045936,
"265-1", "ON", 20200227, "000000", 20200227002400,
"265-1", "SNOOZE", 20200227, "164515", 20200227165515,
"265-1", "OFF", 20200227, "165515", 20200228025936,
"265-1", "ON", 20200228, "023536", 20200228025536,
"265-1", "OFF", 20200228, "025536", 20200228003000,
"265-1", "ON", 20200228, "03000", 20200228035936,
"265-2", "OFF", 20200228, "000000", 20200228180000,
"265-2", "OFF", 20200228, "180000", 20200228235959,
"265-2", "ON", 20200229, "000000", 20200229020000,
)
Вот моя попытка до сих пор
df %>%
mutate(
time = format(strptime(hhmmss, format = "%H%M%S"), format = "%H:%M:%S"),
time = hms::as.hms(time, format = "%H:%M:%S") ,
date = ymd(start_day) ) %>%
group_by(date,id) %>%
filter(time >= hms::as.hms("02:59:59", format = "%H:%M:%S") & code == "ON")
Но я не должен использовать фильтр таким образом, поскольку я теряю запись 265-2
. Вот мой вывод желаний. (** 265-2 записи происходят между сменами 28-02-28 03:00:00 и 28-02-29 03:00:00 и должны назначаться на дату 28/02, а не 29/02. Надеюсь, что это ясно
id code date time
7050-1 ON 20200227 07:34:15
265-1 ON 20200228 03:00:00
265-2 ON 20200228 00:00:00