【问题标题】:Aggregate yearly sum of selected months of a time series in RR中时间序列的选定月份的年度总和
【发布时间】:2017-11-17 10:21:56
【问题描述】:

我有多年的月度数据时间序列。现在我想计算每年的不同指数,例如(i) 年度总和和 (ii) 特定月份(7 月和 8 月)的总和。我想在Rzoo-package 中使用aggregate 函数。

计算年度总和不是问题...

# Test dataset
z_test <-  as.zoo(ts(rnorm(200), start=c(1922,1), frequency=12))

# Yearly sum
as.year <- function(x) as.numeric(floor(as.yearmon(x)))
yearsum <- as.ts(aggregate(z_test, as.year, sum))

..但是,使用聚合返回特定月份总和的最佳方法是什么?例如,我想得到每年 7 月和 8 月的总和(类似于 yearsum 的形状)

JulAug_sum <-?

【问题讨论】:

  • Johannes,这个解决方案对你有用吗?
  • 请注意,as.year &lt;- function(x) as.integer(as.yearmon(x)) 也可以。 ts_test 被定义为 zoo 对象,但随后在聚合语句中又被强制为 zoo,这是多余的。将其称为z_test 可能会更好,以强调它是 zoo 对象而不是 ts 对象。

标签: r time-series aggregate zoo


【解决方案1】:

希望对你有帮助

library(zoo)

# Test dataset
ts_test <-  as.zoo(ts(rnorm(200), start=c(1922,1), frequency=12))

# Yearly sum
as.year <- function(x) as.numeric(floor(as.yearmon(x)))
yearsum <- as.ts(aggregate(as.zoo(ts_test), as.year, sum))


df <- subset(ts_test, (cycle(ts_test) == 7 | cycle(ts_test) == 8))
JulAugsum <- as.ts(aggregate(as.zoo(df), as.year, sum))

【讨论】:

  • 由于df"zoo" 对象,而不是"data.frame",您可能想给它一个不同的名称,例如z78subset 的第二个参数可以写成 cycle(ts_test) %in% 7:8
  • 这也可以,但不太通用,因为如果 sum 被其他函数替换,它不一定会起作用:is78 &lt;- cycle(ts_test) %in% 7:8; as.ts(aggregate(is78 * ts_test, as.year, sum))
  • 这指向了正确的方向,但是这可能会导致问题,例如时间序列的第一年开始晚于 8 月。然后JulAugsum 的输出更短(因此与yearsum 的形状不同)。 z_test &lt;- as.zoo(ts(rnorm(200), start=c(1922,9), frequency=12)); as.year &lt;- function(x) as.numeric(floor(as.yearmon(x))); yearsum &lt;- as.ts(aggregate(z_test, as.year, sum)); z_2 &lt;- subset(z_test, (cycle(z_test) == 7 | cycle(z_test) == 8)); JulAugsum &lt;- as.ts(aggregate(z_2, as.year, sum))
  • @G.Grothendieck ...您的方法提供的结果与yearsum 具有相同的长度/形状。但是,如果没有数据,例如七月 (=NA) 那么总和仍然是 0 而不是 NA?
  • aggregate(is78 * na.fill(ts_test, 0), as.year, sum) 将 NA 替换为 0,然后求和。
猜你喜欢
  • 2021-03-14
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多