我有以下数据:
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)