我有以下数据:

value <- c(1.869, 1.855, 1.855, 1.855, 1.855, 1.855, 1.855, 1.848, 1.848, 1.848, 1.848, 1.848, 1.848, 1.849)
date <- c("2013-08-28 08:00:00 UTC", "2013-08-28 08:05:00 UTC", "2013-08-28 08:10:00 UTC", "2013-08-28 08:15:00 UTC", "2013-08-28 08:20:00 UTC", "2013-08-28 08:25:00 UTC", "2013-08-28 08:30:00 UTC", "2013-08-28 08:35:00 UTC", "2013-08-28 08:40:00 UTC", "2013-08-28 08:45:00 UTC", "2013-08-28 08:50:00 UTC", "2013-08-28 08:55:00 UTC", "2013-08-28 09:00:00 UTC", "2013-08-28 09:05:00 UTC")
indicator <- c(1,0,0,1,0,0,0,0,0,0,0,0,0,1)

data <- data.frame(date=date,value=value, indicator=indicator)

我想做两件事。首先,我希望将其聚合/求和到30分钟的水平,但以:00和:30结尾。例如,此数据中的第一个值将不包括在计算中,但8:05至8:30将被汇总为8:30、8:35至9:00至9:00,依此类推。我也想汇总指标值。因此,如果存在一个1,我希望有一个1(我认为总和也可以工作,因为它不是零)。

我已经尝试了Zoo包中的rollapply(它可以工作,但我必须手动确保数据从8:05开始),但也希望保留日期并汇总指标:
aggdata <- rollapply(data=data$value,width=6,FUN=sum,by=6)

不包含整个30分钟间隔的数据对我来说是无用的,因此我宁愿不包含该数据。我想要的输出是:
date                       value  indicator
"2013-08-28 08:00:00 UTC"  1.869  1
"2013-08-28 08:30:00 UTC"  11.13  1
"2013-08-28 09:00:00 UTC"  11.088 0
"2013-08-28 09:05:00 UTC"  1.849  1

或更好:
date                       value  indicator
"2013-08-28 08:00:00 UTC"  NA     NA
"2013-08-28 08:30:00 UTC"  11.13  1
"2013-08-28 09:00:00 UTC"  11.088 0
"2013-08-28 09:05:00 UTC"  NA     NA

甚至更好:
date                       value  indicator
"2013-08-28 08:30:00 UTC"  11.13  1
"2013-08-28 09:00:00 UTC"  11.088 0

最佳答案

> z <- read.zoo(data, FUN = identity)
> zr <- rollapplyr(z[-1, ], 6, sum, by = 6)
> zr
                         value indicator
2013-08-28 08:30:00 UTC 11.130         1
2013-08-28 09:00:00 UTC 11.088         0

尽管最好将它留在zoo中以将其转换回数据帧,但请使用:fortify.zoo:
library(ggplot2)
fortify(zr)

07-24 09:52
查看更多