R动物园聚合

时间:2014-08-28 18:51:35

标签: r zoo

我有一个包含以下数据的zoo对象:

                          Qty 
2013-11-25 12:41:21.33       2 
2013-11-25 12:41:22.25      2 
2013-11-25 12:41:22.75      75 
2013-11-25 12:41:24.22      3 
2013-11-25 12:41:25.22      1 
2013-11-25 12:41:26.22      1 

我希望按秒聚合它,对每秒内的值求和,并且对于样本中没有的秒数,将数量设置为零,以便我有以下常规系列

                          Qty 
2013-11-25 12:41:21         2 
2013-11-25 12:41:22        77 
2013-11-25 12:41:23        0 
2013-11-25 12:41:24        3 
2013-11-25 12:41:25        1 
2013-11-25 12:41:26        1

注意第三行(尝试使用聚合如晕影中所解释的那样,使用一个转换原始时间戳以消除毫秒精度的函数,在出现第三行并且有一个常规系列时失败)

我试过,感谢下面的回答:

如果a是我原来的动物园系列

b=aggregate(a,by=cut(as.POSIXct(floor(as.numeric(index(a))),origin="1970-01-01"‌​), breaks='1 sec'),FUN=sum) 

但是这给了                           数量     2013-11-25 12:41:21 2     2013-11-25 12:41:22 77     2013-11-25 12:41:24 3     2013-11-25 12:41:25 1     2013-11-25 12:41:26 1

所以没有行

2013-11-25 12:41:23    0

这使得该系列成为常规,这是我的问题 非常感谢您的帮助

1 个答案:

答案 0 :(得分:3)

读入测试数据,按秒聚合,然后将聚合系列与网格合并以填充它:

# read test data

Lines <- "2013-11-25 12:41:21         2 
2013-11-25 12:41:22.25      2 
2013-11-25 12:41:22.75      75 
2013-11-25 12:41:24.22      3 
2013-11-25 12:41:25.22      1 
2013-11-25 12:41:26.22      1"

library(zoo)
z <- read.zoo(text = Lines, index = 1:2, tz = "")

# aggregate and merge with grid to fill it out 

ag <- aggregate(z, as.POSIXct(trunc(time(z), "sec")), sum)
g <- zoo(, seq(start(z), end(z), "sec"))
merge(ag, g, fill = 0)