每n分鐘我有一個包含10個事件在某一時間在給定的一天存在的一個數據集,其中每個事件相應的值:分組與dplyr
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」,以便數據幀具有每個3分鐘的480個分檔)
第一個,我創建了一個包含每個分鐘爲3分鐘的數據幀:
d2 <- data.frame(date = seq(as.POSIXct("2010-05-21 00:00:00"),
by="3 min", length.out=(1440/3)))
然後,我合併兩個dataframes在一起,並刪除來港:
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
試圖Khashaa的回答後,由於沒有指定我的時區是我有錯。所以我有:
> 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")
後,它一切正常。
有了這個解決方案,我收到了481th一行'2010-05-22 02:27:00'爲'interval'和'643426'爲'value' –
我只要運行它在新的會議上,仍然有同樣的結果。我不明白你爲什麼得到不同的結果。 – Khashaa
@StevenBeaupré這是一個時區問題。你在OP中沒有時區的時候調用'as.POSIXct',它將使用你的本地時區,但是Khashaa正在使用'lubridate :: ymd_hms',如果你沒有指定,它會採用'UTC'。如果你在定義'd1'的OP運行代碼之前調用'Sys.setenv(TZ =「UTC」)',你會得到與Khashaa相同的答案。 – GSee