【问题标题】:Rolling mean with different window length不同窗口长度的滚动平均值
【发布时间】:2018-10-03 12:36:41
【问题描述】:

如果两个月的窗口长度不同,我如何计算两个月的滚动平均值?最好在datatable。示例代码:

set.seed(24)
test <- data.table(x = rnorm(762),time=seq(as.Date("1988/03/15"), as.Date("1990/04/15"), "day"))

所以在这里,第一个平均值是从 1988/03/15 到 1988/04/30,第二个平均值是从 1988/04/01 到 1988/05/31,依此类推。每个月的数据可用性可以根据意图具有不同的长度。

【问题讨论】:

  • 你的意思是,例如,第一个值将是从 15/03 到 15/05 的平均值;然后是 16/04 到 16/05 等等?
  • 感谢您的提问。不,我的意思是从 15/03 到 30/04 的第一个。第一个月,可用的天数不多。我编辑了问题。
  • 第二个值是多少?
  • 在速度方面我可以推荐RcppRoll。为更大的数据创造奇迹

标签: r data.table


【解决方案1】:

添加一个yearmon 列,然后用yearmon 汇总x 的总和和长度。
最后将x 上的滚动总和除以N 长度上的滚动总和。

library(data.table)
library(zoo)

Means <- test[, yearmon := as.yearmon(time)][
   , list(x = sum(x), N = .N), by = "yearmon"][
   , list(yearmon, mean = rollsumr(x, 2, fill = NA) / rollsumr(N, 2, fill = NA))]

交替地将test 转换为动物园对象,将x 和长度与yearmon 相加,计算x 和n 的滚动总和,然后将动物园对象与年/月和均值相除。如果您想将其转换为数据框,请参阅 ?fortify.zoo

z <- cbind(x = read.zoo(test, index = "time"), n = 1)
zym <- aggregate(z, as.yearmon, sum)
transform(rollsumr(zym, 2), mean = x / n)

注意

使用的输入是:

set.seed(24)
test <- data.table(x = rnorm(762), time=seq(as.Date("1988/03/15"), 
                          as.Date("1990/04/15"), "day"))

【讨论】:

  • 谢谢。这工作正常。唯一可以改进的是不创建新的数据表(在上述情况下为“手段”)。理想情况下,我只想在现有数据表中创建一个新列。这也可能吗?
  • 不清楚。该列应该包含什么?您想要窗口第二个月的每一天重复的两个月的平均值吗?您是否希望它出现在该月的最后一天,所有其他值为 NA?请手动计算示例输出并将其显示在问题中,以便清楚您想要什么。
  • 嗯,我猜你是对的,会有很多重复,但我的想法是确实有两个月的平均值,或者只在第二个月重复。很高兴看看是否可行,但现在的解决方案已经很好了。
  • 如果你想在第二个月重复每一行的平均值,那么在运行上面的 data.table 代码之后运行merge(test, Means, by = "yearmon")
猜你喜欢
  • 1970-01-01
  • 2020-07-04
  • 2019-01-11
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 2014-02-21
  • 1970-01-01
  • 2018-02-03
相关资源
最近更新 更多