【问题标题】:Evaluate rolling mean by group when groups have insufficient observations当组的观察值不足时,按组评估滚动平均值
【发布时间】:2017-12-05 13:52:14
【问题描述】:

我正在尝试为数据集计算一堆滚动均值 -

     date name px_last 
2012-12-04   A  6.81  
2012-12-05   A  4.28  
2012-12-06   A  4.32
2012-12-04   A  6.89  
2012-12-05   A  7.24    
2012-12-04   B  6.81  
2012-12-05   B  9.38  
2012-12-06   B  3.62
2012-12-04   C  3.85  
2012-12-05   C  4.23  
2012-12-06   C  7.32
2012-12-04   C  2.84  
2012-12-05   C  8.38

这是我正在使用的代码 -

vec = c(2, 3, 4, 5)
for(i in c(1:length(vec))){
  varname = paste0("ma", vec[i])
  df = df %>% group_by(name) %>% mutate(!!varname := rollapplyr(px_last, vec[i], mean, na.rm = TRUE, fill = "NA"))
}

我从第三次迭代中得到的错误是 -

Error in mutate_impl(.data, dots) : 
Evaluation error: wrong sign in 'by' argument.

从这个帖子 - Clueless about this error: wrong sign in 'by' argument - 我知道这是因为某些组的行数不足;在此示例中,使用 name = B 分组

如何在不删除观察值不足的组的情况下计算均值?我希望在由于观察不足而无法计算平均值的地方使用 NA。

【问题讨论】:

  • memb_hist %>% group_by() ... 中的memb_hist 是什么?
  • @ANG,它是数据框的名称。现在编辑它。对不起!
  • @phil_t 你能粘贴一下df的样子吗
  • @Taran,添加了示例 df。

标签: r dplyr zoo rollapply


【解决方案1】:

@phil_t 所以问题是rollapply 试图以right-aligned 的方式应用mean。当在组 B 上的大小为 4 的窗口上尝试此操作时,它只有 3 个值,它正确地失败了。

因此,您需要“规范化” DF 以使每个组具有所需的行数。

library(plyr)
> df <- ddply(df, 'name', function(x) {
                 rbind.fill(x, data.frame(name = rep(unique(x$name), each = max(vec) - nrow(x))))
              })

> df
  date name px_last
  2012-12-04    A    6.81
  2012-12-05    A    4.28
  2012-12-06    A    4.32
  2012-12-04    A    6.89
  2012-12-05    A    7.24
  2012-12-04    B    6.81
  2012-12-05    B    9.38
  2012-12-06    B    3.62
  <NA>    B      NA
  <NA>    B      NA
  2012-12-04    C    3.85
  2012-12-05    C    4.23
  2012-12-06    C    7.32
  2012-12-04    C    2.84
  2012-12-05    C    8.38

> for(i in c(1:length(vec))){
    varname = paste0("ma", vec[i])
    df = df %>% group_by(name) %>% mutate(!!varname := rollapplyr(px_last, vec[i], mean, na.rm = TRUE, fill = "NA"))
  }

这应该会有所帮助。

【讨论】:

  • zoo 的开发版本可以处理比宽度更短的系列,从而避免需要填充。 devtools::install_github("rforge/zoo/pkg/zoo") 安装。
  • @G。格洛腾迪克非常棒。这在 rollapply 中实现了吗?
  • 是的,我指的是这个。
  • @G.Grothendieck,我安装了开发版,但问题仍然间歇性出现。知道为什么它有效但不是一直有效吗?
  • 如果您有可重现的错误示例,您可以将其报告给包维护者。
猜你喜欢
  • 1970-01-01
  • 2021-02-08
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 2014-11-29
  • 1970-01-01
相关资源
最近更新 更多