Прежде всего убедитесь, что переменные Date
и Time
имеют формат даты и времени соответственно. Из того, что вы предоставляете, невозможно сказать, является ли это случаем или эти переменные являются символами или факторами.
Предположим, что они являются символами:
df <- read.table(
text =
"Vehicle.No. Date Time Payment.Amount
SXX0001A 17/08/2019 00:01 1.25
SXX0002A 17/08/2019 00:21 5
SXX0003A 17/08/2019 00:31 0
SXX0004A 17/08/2019 02:01 3
SXX0005A 17/08/2019 03:01 2
SXX0006A 17/08/2019 18:01 1.25
SXX0007A 18/08/2019 00:01 1.25
SXX0008A 18/08/2019 02:01 1.25
SXX0009A 18/08/2019 19:01 1.25
SXX0010A 18/08/2019 20:01 1.25
SXX0006A 20/08/2019 02:01 1.25
SXX0006A 20/08/2019 03:01 3.25
SXX0006A 20/08/2019 01:01 5.25
SXX0006A 20/08/2019 12:01 0
SXX0006A 20/08/2019 14:01 1.25",
stringsAsFactors = F,
header = T
)
str(df$Date)
chr [1:15] "17/08/2019" "17/08/2019" "17/08/2019" "17/08/2019" ...
str(df$Time)
chr [1:15] "00:01" "00:21" "00:31" "02:01" "03:01" "18:01" "00:01" "02:01" ...
Давайте создадим2 новые переменные (date
и datetime
) в форматах даты и времени. Я создаю datetime
переменную, а не time
, потому что это пригодится позже. Пакет readr
имеет отличные функции для анализа векторов.
library(dplyr)
library(readr)
df <-
df %>%
mutate(
date = parse_date(Date, "%d/%m/%Y"),
datetime = parse_datetime(paste(Date, Time), "%d/%m/%Y %H:%M")
)
str(df$date)
Date[1:15], format: "2019-08-17" "2019-08-17" "2019-08-17" ...
str(df$datetime)
POSIXct[1:15], format: "2019-08-17 00:01:00" "2019-08-17 00:21:00" ...
Мне не ясно, как вы хотите выводить данные (хотите ли вы отфильтровать данные, которые соответствуют любому из перечисленных вами времен? или вы хотите фильтровать для каждой даты и периода отдельно?). Предположим, вам нужны все данные, которые соответствуют любому из перечисленных вами дат и периодов времени.
Поскольку нам необходимо фильтровать по одним и тем же периодам в течение нескольких дней, мы будем использовать purrr
, чтобы избежатьповторение кода:
- создать список отфильтрованных фреймов данных (каждый элемент соответствует одному из дней интереса)
- создать функцию, которая будет фильтровать данные за все периоды времениИнтерес на определенный день. Эта функция использует пакет
lubridate
. - , применяет функцию к каждому элементу списка и выводит фрейм данных благодаря
purrr:map_df()
и удаляет созданные нами переменные time
и datetime
(хотявозможно, вам следует оставить их и избавиться от переменных Date
и Time
).
library(purrr)
library(lubridate)
ls <- list(
filter(df, date == "2019-08-17"),
filter(df, date == "2019-08-18"),
filter(df, date == "2019-08-19")
)
select_times <- function(df) {
df %>%
filter(
datetime %within% interval(paste(unique(df$date), "06:00:00"),
paste(unique(df$date), "07:00:00")) |
datetime %within% interval(paste(unique(df$date), "08:30:00"),
paste(unique(df$date), "10:00:00")) |
datetime %within% interval(paste(unique(df$date), "12:00:00"),
paste(unique(df$date), "13:00:00")) |
datetime %within% interval(paste(unique(df$date), "17:30:00"),
paste(unique(df$date), "22:00:00"))
)
}
map_df(ls, select_times) %>%
select(- date, - datetime)
Вывод:
Vehicle.No. Date Time Payment.Amount
1 SXX0006A 17/08/2019 18:01 1.25
2 SXX0009A 18/08/2019 19:01 1.25
3 SXX0010A 18/08/2019 20:01 1.25
Это подмножество вашегоданные за интересующие периоды времени в интересующие дни.
Для альтернативных решений вы можете посмотреть на пакет xts
. Этот пост может быть полезен.