这是R中的一个新手问题。我有一个时间序列对象,我想为该系列创建月度摘要(即平均中位模式)。我希望这是一个矢量。示例如下:
ddd<-c(1:100)
ddd1<-ts(ddd,frequency=12,start=c(1960,1))
我需要的是1月,2月等的平均值。它是带有值的12X1向量。 1月,2月和3月分别为49,50,51。一个很长的方法是使用预测包的seasondummy()函数并进行回归以获得结果,但我正在寻找一个优雅的解决方案。提前谢谢。
答案 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