Группировка каждые 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")
, все работает отлично.