【问题标题】:roll mean based on conditions in R基于 R 中条件的滚动平均值
【发布时间】:2014-02-06 13:52:03
【问题描述】:

我想在 R 中使用移动平均函数 (rollmean)。示例数据:

x<-seq(1,48,by=1)
y<-c(rep(11,12), rep(12,12))
z<-data.frame(x,y)

我想计算 z[,"x"] 的移动平均值,每个 z[,"y"](即 11 和 12)滞后 3 天,并将它们填充到(新)第三列,其中每个 z[,"y"] 的前两行是由NAs指定。

【问题讨论】:

  • 你试过什么?这可以帮助你stackoverflow.com/questions/17765001/…
  • 有什么理由使用data.table 而不是数据框?为什么yx 短?我很确定您可以使用 rollapply(x, widths={something to do with y},...) 在一行中完成此操作

标签: r conditional-statements data.table moving-average


【解决方案1】:

使用zoo 例如使用data.table 包:

library(zoo)
library(data.table)
DT <- data.table(z)
DT[, roll_x := rollmeanr(x, 3, fill = NA), y]

当然,如果有一些缺失值,最好使用rollapplyr

DT[, roll_x := rollapplyr(x, 3, mean, fill = NA), y]

另一个更快的包是caTools

library(caTools)
DT[, roll_x := runmean(x, 3, align = 'right', endrule = 'NA'), by = y]

就数据框而言,这也适用:

transform(z, roll_x = ave(x, y, FUN = function(x) rollmeanr(x, 3, fill = NA)))

【讨论】:

  • 向你们俩问好)
  • 我很抱歉,但为什么我在应用到我的原始数据时收到错误“drop && !has.j : invalid 'x' type in 'x && y'”的错误
  • 我发现caTools 是迄今为止最快的滚动方式包
【解决方案2】:

您可以使用基本函数filter

z[ , moving_average := filter(x, rep(1/3, 3), sides = 1), by = "y"]

请注意,滞后 3 会导致 两个 NAs。

【讨论】:

  • 哦,是的。我太着急了,我犯了两个愚蠢的错误。我现在会更正它们。
  • 我发现 filter 在与 data.table 结合使用时比 rollmean 更健壮
猜你喜欢
  • 1970-01-01
  • 2015-04-11
  • 1970-01-01
  • 1970-01-01
  • 2017-08-31
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 2021-08-28
相关资源
最近更新 更多