在R中的apply.daily()中聚合求平均时间序列

时间:2016-04-28 03:01:12

标签: r xts zoo

我有几个合并的每日动物园时间序列(假设合并集的名称是'test'),它们采用以下格式:

>test 


              TS1     TS2     TS3
2014-07-30    2.0     3.0     4.0
2014-07-31    2.5     3.0     4.5
2014-08-01    3.0     3.0     5.0

我想以多种方式聚合/操纵时间序列。然而,最简单的平均或求和正在逃避我。我尝试了以下方法:

ts <- apply.daily(as.xts(test),mean)

我曾想过会给我以下输出:

>ts

                  X    
    2014-07-30    3.0     
    2014-07-31    3.3     
    2014-08-01    3.7    

然而,它返回与以前相同的时间序列。我理解这对于我计划使用的apply.weekly()apply.monthly()都很有用,但是我如何调整所有这些函数来将TS1,TS2和TS3包装成一个整体平均值。相同的基础,同时保持zoo / xts格式。

非常感谢

1 个答案:

答案 0 :(得分:2)

根据显示的示例,我们可以连接行并获取mean

apply.daily(as.xts(test), function(x) round(mean(c(x)),1))
#          [,1]
#2014-07-30  3.0
#2014-07-31  3.3
#2014-08-01  3.7

请注意,在每日数据集上使用OP代码会返回输入数据,因为标准只有一个观察值。假设数据集是否为datetime类,那么使用apply.daily将为每一天返回mean,并使用另一个mean将其包起来获取每行的mean,即

test1 <- structure(list(TS1 = c(2, 2.5, 3, 2.2), TS2 = c(3, 3, 3, 3.2), 
TS3 = c(4, 4.5, 5, 4.4)), .Names = c("TS1", "TS2", "TS3"), 
 class = "data.frame", row.names = c("2014-07-30 07:00:00", 
"2014-07-31 05:00:00", "2014-08-01 03:00:00", "2014-07-30 07:20:00"))

apply.daily(as.xts(test1), function(x) round(mean(mean(x)),1))
#                   [,1]
#2014-07-30 07:20:00  3.1
#2014-07-31 05:00:00  3.3
#2014-08-01 03:00:00  3.7

由于我们使用的是匿名函数,因此我们不需要这两个mean

 apply.daily(as.xts(test1), function(x) round(mean(x),1))
 #                     [,1]
 #2014-07-30 07:20:00  3.1
 #2014-07-31 05:00:00  3.3
 #2014-08-01 03:00:00  3.7

使用OP的方法检查上述结果

apply.daily(as.xts(test1), mean)
#                   TS1 TS2 TS3
#2014-07-30 07:20:00 2.1 3.1 4.2
#2014-07-31 05:00:00 2.5 3.0 4.5
#2014-08-01 03:00:00 3.0 3.0 5.0

round(mean(c(2.1, 3.1, 4.2)), 1)
#[1] 3.1
round(mean(c(2.5, 3.0, 4.5)), 1)
#[1] 3.3