Группировка каждые n минут с помощью dplyr

У меня есть набор данных, содержащий 10 событий, происходящих в определенное время в определенный день, с соответствующим значением для каждого события:

d1 <- data.frame(date = as.POSIXct(c("21/05/2010 19:59:37", "21/05/2010 08:40:30", 
                            "21/05/2010 09:21:00", "21/05/2010 22:29:50", "21/05/2010 11:27:34", 
                            "21/05/2010 18:25:14", "21/05/2010 15:16:01", "21/05/2010 09:41:53", 
                            "21/05/2010 15:01:29", "21/05/2010 09:02:06"), format ="%d/%m/%Y %H:%M:%S"),
                 value = c(11313,42423,64645,643426,1313313,1313,3535,6476,11313,9875))

Я хочу агрегировать результаты каждые 3 минуты в стандартном формате данных (с «21.05.2010 00:00:00» до «21.05.2010 23:57:00»), чтобы в кадре было 480 бинов по 3 минуты каждый)

Сначала я создаю фрейм данных, содержащий ячейки по 3 минуты:

d2 <- data.frame(date = seq(as.POSIXct("2010-05-21 00:00:00"), 
                            by="3 min", length.out=(1440/3)))

Затем я объединяю два кадра данных и удаляю NA:

library(dplyr)
m <- merge(d1, d2, all=TRUE) %>% mutate(value = ifelse(is.na(value),0,value))

Наконец, я используюperiod.apply() отxts пакет для суммирования значений для каждого бина:

library(xts)
a <- period.apply(m$value, endpoints(m$date, "minutes", 3), sum)

Есть ли более эффективный способ сделать это? Это не чувствует себя оптимальным.

Обновление № 1

Я исправил свой код после ответа Джошуа:

library(xts)
startpoints <- function (x, on = "months", k = 1) { 
  head(endpoints(x, on, k) + 1, -1) 
}

m <- seq(as.POSIXct("2010-05-21 00:00:00"), by="3 min", length.out=1440/3)
x <- merge(value=xts(d1$value, d1$date), xts(,m))
y <- period.apply(x, c(0,startpoints(x, "minutes", 3)), sum, na.rm=TRUE)

Я не знал, чтоna.rm=TRUE может быть использован сperiod.apply(), который теперь позволяет мне пропуститьmutate(value = ifelse(is.na(value),0,value)), Это шаг вперед, и я на самом деле доволенxts Подход здесь, но я хотел бы знать, если естьчистый dplyr Решение, которое я мог бы использовать в такой ситуации.

Обновление № 2

После попытки ответа Хашаа у меня произошла ошибка, потому что мой часовой пояс не был указан. Итак, у меня было:

> tail(d4)
               interval sumvalue
476 2010-05-21 23:45:00       NA
477 2010-05-21 23:48:00       NA
478 2010-05-21 23:51:00       NA
479 2010-05-21 23:54:00       NA
480 2010-05-21 23:57:00    11313
481 2010-05-22 02:27:00   643426
> d4[450,]
               interval sumvalue
450 2010-05-21 22:27:00       NA

Теперь, послеSys.setenv(TZ="UTC"), все работает отлично.

Ответы на вопрос(4)

Ваш ответ на вопрос