gpt4 book ai didi

rollapply() 由 n 个月

转载 作者:行者123 更新时间:2023-12-02 14:52:35 25 4
gpt4 key购买 nike

我正在寻找一种使用 rollapply 将系列拆分为 n 个月的序列的方法。假设您有以下内容:

z <- zoo(101:465, as.Date(1:365))
as.data.frame(z)

我想获取每个 n 个月的索引值向量列表(或列表),以便我可以处理数据...很像宽度参数在 rollapply 中实现,除了在这种情况下的宽度是变量(取决于一个月中的天数)。

注意:更喜欢 base-R 解决方案,但很高兴看到可以使用的其他库

最佳答案

1。聚合

如果您正在寻找的是您对问题的回答中的代码描述的处理,那么您正在寻找的最好描述为聚合而不是函数的滚动应用程序。

要获得每个月、每个季度和每个 n 个月的平均值,请使用 aggregate.zoo :

myfun <- mean
aggregate(z, as.yearmon, myfun)
## Jan 1970 Feb 1970 Mar 1970 Apr 1970 May 1970 Jun 1970 Jul 1970 Aug 1970
## 115.5 144.5 174.0 204.5 235.0 265.5 296.0 327.0
## Sep 1970 Oct 1970 Nov 1970 Dec 1970 Jan 1971
## 357.5 388.0 418.5 449.0 465.0

aggregate(z, as.yearqtr, myfun)
## 1970 Q1 1970 Q2 1970 Q3 1970 Q4 1971 Q1
## 145.0 235.0 326.5 418.5 465.0

n <- 3
aggregate(z, as.Date(cut(index(z), paste(n, "months"))), myfun)
## 1970-01-01 1970-04-01 1970-07-01 1970-10-01 1971-01-01
## 145.0 235.0 326.5 418.5 465.0

或使用 as.yearmon代替 as.Date .在上面mean可以用任意函数替换。

2。滚动应用

a) 如果你真的想翻过 n 个月,那么创建一个动物园对象 ag每月一行,31 列在短短几个月内用 NA 填充额外的列。然后运行 ​​rollapplyr具有将每次迭代的数据分解为一个长向量的函数,删除在短月份结束时添加的 NA,并将其输入我们的任意函数。

n <- 3
myfun <- mean

ag <- aggregate(z, as.yearmon, "length<-", value = 31)
rollapplyr(ag, n, function(x) myfun(na.omit(c(t(x)))), fill = NA, by.column = FALSE)
## Jan 1970 Feb 1970 Mar 1970 Apr 1970 May 1970 Jun 1970 Jul 1970 Aug 1970
## NA NA 145.0 175.0 204.5 235.0 265.5 296.5
## Sep 1970 Oct 1970 Nov 1970 Dec 1970 Jan 1971
## 326.5 357.5 388.0 418.5 434.5

b)另一种可能性是:

s <- split(z, as.yearmon(index(z)))
r <- rollapplyr(seq_along(s), n, function(ix) myfun(unlist(s[ix])), fill = NA)
zoo(r, as.yearmon(names(s), "%b %Y"))
## Jan 1970 Feb 1970 Mar 1970 Apr 1970 May 1970 Jun 1970 Jul 1970 Aug 1970
## NA NA 145.0 175.0 204.5 235.0 265.5 296.5
## Sep 1970 Oct 1970 Nov 1970 Dec 1970 Jan 1971
## 326.5 357.5 388.0 418.5 434.5

3。滚动应用均值

以下工作均值,但取决于您的任意函数是什么,它们可能可以修改以使用它。

a) 首先,创建一个 2 列的动物园对象 ag其行是每个月的总和和长度,然后使用 rollapplyr

n <- 3
ag2 <- aggregate(z, as.yearmon, function(x) c(sum(x), length(x)))
rollapplyr(ag2, 3, function(x) sum(x[, 1]) / sum(x[, 2]), fill = NA, by.column = FALSE)
## Jan 1970 Feb 1970 Mar 1970 Apr 1970 May 1970 Jun 1970 Jul 1970 Aug 1970
## NA NA 145.0 175.0 204.5 235.0 265.5 296.5
## Sep 1970 Oct 1970 Nov 1970 Dec 1970 Jan 1971
## 326.5 357.5 388.0 418.5 434.5

b) 或者另一种选择是创建一个复杂的动物园对象 ag3其实部和虚部是每个月的总和和天数以及使用rollapplyr对此:

ag3 <- aggregate(z, as.yearmon, function(x) complex(real = sum(x), imag = length(x)))
rollapplyr(ag3, 3, function(x) sum(Re(x)) / sum(Im(x)), fill = NA)
## Jan 1970 Feb 1970 Mar 1970 Apr 1970 May 1970 Jun 1970 Jul 1970 Aug 1970
## NA NA 145.0 175.0 204.5 235.0 265.5 296.5
## Sep 1970 Oct 1970 Nov 1970 Dec 1970 Jan 1971
## 326.5 357.5 388.0 418.5 434.5

关于rollapply() 由 n 个月,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54834356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com