超过阈值的时间序列值的总计数,按年 - 月

时间:2014-10-20 19:49:06

标签: r aggregate threshold

我现在正在学习R并使用SEAS软件包来帮助我在R中进行一些计算,数据与SEAS软件包的格式相同。这是一个时间序列

require(seas)
data(mscdata)
dat.int <- (mksub(mscdata, id=1108447))

数据的标题,它是20年的数据

  year yday  date t_max t_min t_mean rain snow precip

但是,我现在需要计算每个月的降雨天数> = 1.0mm。所以最后。我会有两列(每年每个月,每个月的总天数#> 1.0毫米)

我不确定如何编写此代码,我们将不胜感激

谢谢

1 个答案:

答案 0 :(得分:2)

  

我现在需要计算每个月的降雨天数> = 1.0毫米。所以最后。我会有两列(每年每个月,每个月的总天数#> 1.0毫米)

1)所以dat.int $ date是一个Date对象。第一步是您需要创建一个新列dat.int$yearmon来提取年 - 月,例如使用zoo::yearmon Extract month and year from a zoo::yearmon object

require(zoo)
dat.int$yearmon <- as.yearmon(dat.int$date, "%b %y")

2)其次,您需要在yearmon汇总的rain>=1.0上执行汇总操作(建议您使用plyr或更新的dplyr)。我们将结果列命名为 rainy_days

如果您想将rainy_days列存储回dat.int数据框,请使用transform代替summarize

ddply(dat.int, .(yearmon), transform, rainy_days=sum(rain >= 1.0) )

或者如果你真的只想要一个新的摘要数据框:

require(plyr)
rainydays_by_yearmon <- ddply(dat.int, .(yearmon), summarize, rainy_days=sum(rain >= 1.0) )
print.data.frame(rainydays_by_yearmon)

     yearmon rainy_days
1   Jan 1975         14
2   Feb 1975         12
3   Mar 1975         13
4   Apr 1975          6
5   May 1975          6
6   Jun 1975          5
...
355 Jul 2004          3
356 Aug 2004          7
357 Oct 2004         14
358 Nov 2004         16
359 Dec 2004         19

注意:您可以使用普通的旧R来执行上述操作,而无需使用zooplyr/dplyr个包。但也许可以教你更好,更具伸缩性,可维护的代码习惯用法。