Tôi có một dataset chứa 10 sự kiện xảy ra tại một thời điểm nhất định vào một ngày nhất định, với giá trị tương ứng cho mỗi sự kiện:Grouping mỗi phút n với 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))
tôi muốn tổng hợp các kết quả mỗi 3 phút, theo định dạng khung dữ liệu chuẩn (từ "21/05/2010 00:00:00" đến "21/05/2010 23:57:00", sao cho khung dữ liệu có 480 thùng mỗi 3 phút)
Đầu tiên , Tôi tạo một khung dữ liệu chứa các thùng chứa 3 phút mỗi:
d2 <- data.frame(date = seq(as.POSIXct("2010-05-21 00:00:00"),
by="3 min", length.out=(1440/3)))
Sau đó, tôi hợp nhất hai dataframes với nhau và loại bỏ NA:
library(dplyr)
m <- merge(d1, d2, all=TRUE) %>% mutate(value = ifelse(is.na(value),0,value))
Cuối cùng, tôi sử dụng period.apply()
từ gói xts
để tổng hợp các giá trị cho mỗi bin:
library(xts)
a <- period.apply(m$value, endpoints(m$date, "minutes", 3), sum)
Có hiệu quả hơn cách để làm điều này? Nó không cảm thấy tối ưu.
Update # 1
tôi điều chỉnh mã của tôi sau câu trả lời của Giô-suê:
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)
Tôi đã không biết rằng na.rm=TRUE
có thể được sử dụng với period.apply()
, mà bây giờ cho phép tôi bỏ qua mutate(value = ifelse(is.na(value),0,value))
. Đó là một bước tiến và tôi thực sự hài lòng với cách tiếp cận xts
ở đây nhưng tôi muốn biết nếu có một giải pháp tinh khiết dplyr
tôi có thể sử dụng trong tình huống như vậy.
Update # 2
Sau khi cố gắng trả lời Khashaa, tôi đã có một lỗi vì múi giờ của tôi đã không được xác định. Vì vậy, tôi đã có:
> 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
Bây giờ, sau Sys.setenv(TZ="UTC")
, tất cả đều hoạt động tốt.
Với giải pháp này, tôi có được một hàng 481th với '2010/05/22 02: 27: 00' là' interval' và '643426' như 'giá trị' –
Tôi chỉ cần chạy nó trên một phiên mới, vẫn có kết quả tương tự. Tôi không hiểu tại sao bạn lại có kết quả khác. – Khashaa
@ StevenBeaupré Đó là vấn đề múi giờ. Bạn gọi 'as.POSIXct' không có múi giờ trong OP, sẽ sử dụng múi giờ địa phương của bạn, nhưng Khashaa đang sử dụng' lubridate :: ymd_hms', giả sử 'UTC' nếu bạn không chỉ định. Nếu bạn gọi 'Sys.setenv (TZ =" UTC ")' trước khi chạy mã từ OP xác định 'd1', bạn sẽ nhận được câu trả lời tương tự như Khashaa. – GSee