суммировать по временному интервалу не работает

У меня есть следующие данные в виде списка раз POSIXct за один месяц. Каждый из них представляет собой доставку велосипеда. Моя цель - найти среднее количество доставок велосипедов за десятиминутный интервал за 24-часовой период (всего 144 ряда). Сначала необходимо суммировать все поездки и объединить их в интервал, а затем разделить на количество дней. Пока мне удалось написать код, который суммирует поездки за 10-минутный интервал, но дает неверные значения. Я не уверен, где что-то пошло не так.

Данные выглядят так:

head(start_times)
[1] "2014-10-21 16:58:13 EST" "2014-10-07 10:14:22 EST" "2014-10-20 01:45:11 EST"
[4] "2014-10-17 08:16:17 EST" "2014-10-07 17:46:36 EST" "2014-10-28 17:32:34 EST"
length(start_times)
[1] 1747


Код выглядит так:

library(lubridate)
library(dplyr)

tripduration <- floor(runif(1747) * 1000)

time_bucket <- start_times - minutes(minute(start_times) %% 10) - seconds(second(start_times))

df <- data.frame(tripduration, start_times, time_bucket)
summarized <- df %>%
group_by(time_bucket) %>%
summarize(trip_count = n())
summarized <- as.data.frame(summarized)
out_buckets <- data.frame(out_buckets = seq(as.POSIXlt("2014-10-01 00:00:00"), as.POSIXct("2014-10-31 23:0:00"), by = 600))
out <- left_join(out_buckets, summarized, by = c("out_buckets" = "time_bucket"))
out$trip_count[is.na(out$trip_count)] <- 0

head (out) out_buckets trip_count 1 2014-10-01 00:00:00 0 2 2014-10-01 00:10:00 0 3 2014-10-01 00:20:00 0 4 2014-10-01 00: 30:00 0 5 2014-10-01 00:40:00 0 6 2014-10-01 00:50:00 0 dim (out) [1] 4459 2

test <- format(out$out_buckets,"%H:%M:%S")
test2 <- out$trip_count
test <- cbind(test, test2)
colnames(test)[1] <- "interval"
colnames(test)[2] <- "count"
test <- as.data.frame(test)
test$count <- as.numeric(test$count) 
test <- aggregate(count~interval, test, sum)
head(test, n = 20)
   interval count
1  00:00:00    32
2  00:10:00    33
3  00:20:00    32
4  00:30:00    31
5  00:40:00    34
6  00:50:00    34
7  01:00:00    31
8  01:10:00    33
9  01:20:00    39
10 01:30:00    41
11 01:40:00    36
12 01:50:00    31
13 02:00:00    33
14 02:10:00    34
15 02:20:00    32
16 02:30:00    32
17 02:40:00    36
18 02:50:00    32
19 03:00:00    34
20 03:10:00    39

но это невозможно, потому что когда я подсчитываю

sum(test$count) [1] 7494

Я получаю 7494, тогда как число должно быть 1747

Я не уверен, где я ошибся и как упростить этот код, чтобы получить тот же результат.


person iskandarblue    schedule 19.01.2016    source источник
comment
Сделайте ваш пример воспроизводимым.   -  person    schedule 19.01.2016


Ответы (1)


Я сделал все, что мог, но я не могу воспроизвести вашу проблему без ваших данных.

library(dplyr)

Я создал полную последовательность 10-минутных блоков:

blocks.of.10mins <- data.frame(out_buckets=seq(as.POSIXct("2014/10/01 00:00"), by="10 mins", length.out=30*24*6))

Затем разделите start_times на те же ячейки. Примечание. Я установил базовое время - полночь, чтобы блоки выровнялись по 10-минутным интервалам. Удаление этого позже - упражнение для читателя. Я также изменил одну из ваших точек данных, чтобы в одной корзине был хотя бы один пример нескольких записей.

start_times <- as.POSIXct(c("2014-10-01 00:00:00", ## added
                            "2014-10-21 16:58:13",
                            "2014-10-07 10:14:22",
                            "2014-10-20 01:45:11",
                            "2014-10-17 08:16:17",
                            "2014-10-07 10:16:36", ## modified
                            "2014-10-28 17:32:34"))

trip_times <- data.frame(start_times) %>% 
    mutate(out_buckets = as.POSIXct(cut(start_times, breaks="10 mins")))

Затем start_times и все 10-минутные интервалы можно объединить.

trips_merged <- merge(trip_times, blocks.of.10mins, by="out_buckets", all=TRUE)

Затем их можно сгруппировать по 10-минутным блокам и посчитать.

trips_merged %>% filter(!is.na(start_times)) %>% 
  group_by(out_buckets) %>% 
  summarise(trip_count=n())

Source: local data frame [6 x 2]

          out_buckets trip_count
               (time)      (int)
1 2014-10-01 00:00:00          1
2 2014-10-07 10:10:00          2
3 2014-10-17 08:10:00          1
4 2014-10-20 01:40:00          1
5 2014-10-21 16:50:00          1
6 2014-10-28 17:30:00          1    

Вместо этого, если мы будем рассматривать только время, а не дату

trips_merged2 <- trips_merged
trips_merged2$out_buckets <- format(trips_merged2$out_buckets, "%H:%M:%S")

trips_merged2 %>% filter(!is.na(start_times)) %>% 
  group_by(out_buckets) %>% 
  summarise(trip_count=n())

Source: local data frame [6 x 2]

  out_buckets trip_count
        (chr)      (int)
1    00:00:00          1
2    01:40:00          1
3    08:10:00          1
4    10:10:00          2
5    16:50:00          1
6    17:30:00          1
person Jonathan Carroll    schedule 19.01.2016