Во-первых, вам нужно отформатировать DateTime
как дату-время, а не как символ.lubridate::ymd_hms
полезно для этого (при условии, что ваши даты - ymd).
Далее, конвертируйте DateTime
в дату.Теперь вы можете group_by
ID и дату, затем filter
для минимума DateTime
.
Наконец, один из способов получить время - отформатировать, используя strftime
.
library(dplyr)
library(lubridate)
df %>%
mutate(DateTime = ymd_hms(DateTime),
Date = as_date(DateTime)) %>%
group_by(Date, ID) %>%
filter(DateTime == min(DateTime)) %>%
ungroup() %>%
mutate(Time = strftime(DateTime, "%H:%M:%S", tz = "UTC"))
Результат:
# A tibble: 4 x 4
DateTime ID Date Time
<dttm> <chr> <date> <chr>
1 2018-03-04 16:10:00 A 2018-03-04 16:10:00
2 2018-03-04 16:30:00 B 2018-03-04 16:30:00
3 2018-03-05 16:45:00 B 2018-03-05 16:45:00
4 2018-03-07 16:12:00 C 2018-03-07 16:12:00