2012-01-19 31 views
3

我正在尝试做一些看起来很简单的事情,但它证明了一些挑战,所以我希望有人能够提供帮助!
我有一个时间序列温度的观测:基于平均月份和滚动数据的值之间的差异

Lines <-"1971-01-17 298.9197 
1971-01-17 298.9197 
1971-02-16 299.0429 
1971-03-17 299.0753 
1971-04-17 299.3250 
1971-05-17 299.5606 
1971-06-17 299.2380 
2010-07-14 298.7876 
2010-08-14 298.5529 
2010-09-14 298.3642 
2010-10-14 297.8739 
2010-11-14 297.7455 
2010-12-14 297.4790" 

DF <- read.table(textConnection(Lines), col.names = c("Date", "Value")) 

DF$Date <- as.Date(DF$Date) 

mean.ts <- aggregate(DF["Value"], format(DF["Date"], "%m"), mean) 

这将产生:

> mean.ts 
    Date Value 
1 01 1.251667 
2 02 1.263333 

这仅仅是一个例子 - 我的数据是多年的,所以我可以计算出一个完整的月平均的数据。
然后我想要做的就是计算1月份(单独)与上面计算的1月份平均值的差值。

如果我离开使用日期/时间类,我可以做一些循环,但我想看看是否有一个“简洁”的方式来做到这一点在R?有任何想法吗?

+0

我清理了一下你的代码,但无法得到你所说的'mean.ts'(即值刚刚超过1)。 – James

+0

小提示。从2.14开始,'read.table'有一个'text'参数。 –

+0

你也可以使用'as.POSIXlt(DF [[Date]]] $ mon'虽然'format'仍然更容易IMO。 –

回答

1

您可以将年份添加为聚合变量。这种情况很容易使用配方接口:

> aggregate(Value~format(Date,"%m")+format(Date,"%Y"),data=DF,mean) 
    format(Date, "%m") format(Date, "%Y") Value 
1     01    1971 298.9197 
2     02    1971 299.0429 
3     03    1971 299.0753 
4     04    1971 299.3250 
5     05    1971 299.5606 
6     06    1971 299.2380 
7     07    2010 298.7876 
8     08    2010 298.5529 
9     09    2010 298.3642 
10     10    2010 297.8739 
11     11    2010 297.7455 
12     12    2010 297.4790 
1

至少我知道你想每个月的那些个月的平均差异的问题,所以你可能要使用ave,而不是总:

diff.mean.ts <- ave(DF[["Value"]], 
         list(format(DF[["Date"]], "%m")), FUN=function(x) x-mean(x)) 

如果你在同一个数据帧想它,然后只需将其指定为列:

DF$ diff.mean.ts <- diff.mean.ts 

ave功能设计用于向现有数据框添加列,因为它返回的长度与第一个参数中的值数量相同,在此情况下为DF [[“Value”]]。在本例中,它返回所有的0,这是正确的答案,因为每个月只有一个值。

+0

谢谢!这正是我所追求的! –

相关问题