您可以使用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(月 mod 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 重新创建相同的结果(尽管以列表形式),如下所示,但我倾向于发现ddply 的data.frame 的输出更适合进一步分析
tapply(ddd, ddd1%%12, function(x) c(mean=mean(x), median=median(x), min=min(x), max=max(x)))