2013-05-07 55 views
0

我想计算与多个台站的时间序列上的每月温度异常。 我在这里称之为“异常”,即从一个时期的平均值计算出的单个值的差异。时间序列上的异常计算

我的数据帧看起来像这样(我们称之为 “数据”):

Station Year Month Temp 
A 1950 1 15.6 
A 1980 1 12.3 
A 1990 2 11.4 
A 1950 1 15.6 
B 1970 1 12.3 
B 1977 2 11.4 
B 1977 4 18.6 
B 1980 1 12.3 
B 1990 11 7.4 

首先,我做了包括1980年和1990年之间的年份的一个子集:

data2 <- subset(data, Year>=1980& Year<=1990) 

其次,我用plyr来计算每个台站在1980年到1990年之间的月平均值(我们称之为“MeanBase”):

data3 <- ddply(data2, .(Station, Month), summarise, 
       MeanBase = mean(Temp, na.rm=TRUE)) 

现在,我想为每一行数据计算相应的MeanBase和Temp的值之间的差异......但我不确定是否以正确的方式(我没有看到如何使用data3)。

+0

什么是Tmean? – 2013-05-07 13:30:52

+0

它是Temp ...我改变了它 – user2165907 2013-05-07 13:31:47

回答

1

你可以在基础R中使用ave来得到它。

transform(data, 
      Demeaned=Temp - ave(replace(Temp, Year < 1980 | Year > 1990, NA), 
           Station, Month, FUN=function(t) mean(t, na.rm=TRUE))) 

# Station Year Month Temp Demeaned 
# 1  A 1950  1 15.6 3.3 
# 2  A 1980  1 12.3 0.0 
# 3  A 1990  2 11.4 0.0 
# 4  A 1950  1 15.6 3.3 
# 5  B 1970  1 12.3 0.0 
# 6  B 1977  2 11.4 NaN 
# 7  B 1977  4 18.6 NaN 
# 8  B 1980  1 12.3 0.0 
# 9  B 1990 11 7.4 0.0 

结果列将有NaN■对于具有在指定范围内无数年来月 - 站组合。

+0

对不起,我改变了(再次)我的第一篇文章:平均值必须计算在1980年和1990年之间,但是必须计算所有年份的初始数据集的异常 – user2165907 2013-05-07 13:45:44

+0

我不认为这是计算我想要的。也许我的解释不清楚。我想得到的是:i)对于每个台站和每个月,1980到1990之间的平均值ii)对于每个台站,每个月以及数据集的所有年份,获得平均值之间的差值1980年和1990年)和记录的价值...这就是我所说的“异常” – user2165907 2013-05-07 15:14:06

+0

这就是这样做,但它然后从每个温度中减去该平均值。取出'Temp'来查看手段。 – 2013-05-07 15:17:20