r中时间序列的每月摘要

时间:2014-05-13 01:19:43

标签: r

这是R中的一个新手问题。我有一个时间序列对象,我想为该系列创建月度摘要(即平均中位模式)。我希望这是一个矢量。示例如下:

ddd<-c(1:100)
ddd1<-ts(ddd,frequency=12,start=c(1960,1))

我需要的是1月,2月等的平均值。它是带有值的12X1向量。 1月,2月和3月分别为49,50,51。一个很长的方法是使用预测包的seasondummy()函数并进行回归以获得结果,但我正在寻找一个优雅的解决方案。提前谢谢。

2 个答案:

答案 0 :(得分:2)

这可能有点笨重,而且我确信这有一个更好的zoo函数,但本着学习的东西,你可以用基础R函数来处理{ {1}}对象:

ts

...将从window(ddd1, c(1960,1), deltat=1) (1月)开始,每12个月提取一个值(deltat = 12/12 = 1),这意味着您可以1960.1这个函数如下:

sapply

答案 1 :(得分:2)

您可以使用tapply,通过另一个向量中的值对矢量分组应用函数很有用

> v<-rnorm(48)  #our fake values
> mos<-rep(1:12,4)  # our months, jan=1, feb=2 etc, for 4 years
> tapply(v, mos, mean) #take the mean of values in vector v by mos
            1             2             3             4             5 
-0.7616624170 -0.4196531309  0.1366554601 -0.1670395139 -0.0954241388 
            6             7             8             9            10 
 0.1867522250 -0.1505984224 -0.0897725216 -0.0005245822 -0.0870436711 
           11            12 
 0.5518353674 -0.0652350665 

将此应用到您的示例中,您可以通过查看月份%% 12(月份模式12),s.t december = 0,jan = 1等来进行分组

> ddd1 %% 12
     Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec
1960   1   2   3   4   5   6   7   8   9  10  11   0
1961   1   2   3   4   5   6   7   8   9  10  11   0
1962   1   2   3   4   5   6   7   8   9  10  11   0
1963   1   2   3   4   5   6   7   8   9  10  11   0
1964   1   2   3   4   5   6   7   8   9  10  11   0
1965   1   2   3   4   5   6   7   8   9  10  11   0
1966   1   2   3   4   5   6   7   8   9  10  11   0
1967   1   2   3   4   5   6   7   8   9  10  11   0
1968   1   2   3   4                                
> tapply(ddd,ddd1 %% 12, mean)
 0  1  2  3  4  5  6  7  8  9 10 11 
54 49 50 51 52 47 48 49 50 51 52 53 

我最喜欢的版本:使用plyr

> ddply(data.frame(mo=ddd1%%12, val=ddd), .(mo), summarize, mean=mean(val), median=median(val), min=min(val), max=max(val))
   mo mean median min max
1   0   54     54  12  96
2   1   49     49   1  97
3   2   50     50   2  98
4   3   51     51   3  99
5   4   52     52   4 100
6   5   47     47   5  89
7   6   48     48   6  90
8   7   49     49   7  91
9   8   50     50   8  92
10  9   51     51   9  93
11 10   52     52  10  94
12 11   53     53  11  95

您可以使用tapply重新创建相同的结果(尽管采用列表形式),但我倾向于发现data.frame的{​​{1}}输出更适合进一步使用分析

ddply