【问题标题】:Moving average over time series随时间序列移动的平均值
【发布时间】:2017-07-07 22:08:43
【问题描述】:

我需要帮助来获取变量 E、N 和 Z 的平均值,每个 ID 相差 7 天。

数据框为 290512 x 5,head 如下所示:

ID  Date        E           N       Z
1   2012-03-16  676620.5    4090699 26.827
1   2012-03-16  676620.5    4090699 26.828
1   2012-03-16  676620.5    4090699 26.827
1   2012-03-16  676620.5    4090699 26.828
1   2012-03-16  676620.5    4090699 26.828
1   2012-03-16  676620.5    4090699 26.828

声明:

  1. ID <- 1:21;
  2. 日期从 2012 年 3 月 16 日到 2016 年 12 月 31 日,没有连续性(没有 NA);
  3. 名词。 obs 的 E = N = Z;
  4. 每个点的#obs 可能不同。

例如,如果我在 ID = 5 时得到 E,我也会在这个观测中得到 N 和 Z,但同时我无法得到 ID = 12 的 obs。这些数据来自土壤变形和土壤质量解决了一些全站仪目标。

到目前为止我的解决方案是

df_dm <- df %>%
group_by(ID, Date) %>%
summarise(E_dm = mean(E),
          N_dm = mean(N),
          Z_dm = mean(Z))

得到每日的手段,然后,

m <- 7
df_wm <- sapply(df_dm, function(x) rollapply( x, width = m, by = m, align = "left", FUN = mean))

它来自移动平均问题的答案。

【问题讨论】:

    标签: r dataframe multiple-columns moving-average


    【解决方案1】:

    您的示例数据只有一个日期。您想通过 7 天的单独窗口(例如,按周)计算平均值吗?如果是这样,您可以创建一个新列 Week,并为每周提供一个唯一标识符,并使用它来分组,而不是 Date

    或者,您可能希望采用滚动平均值。查看zoo 包中的函数rollmean。例如:

    x.Date <- as.Date(paste(2004, rep(1:4, 4:1), sample(1:28, 10), sep = "-"))
    x <- zoo(rnorm(12), x.Date)
    
    rollmean(x, 3)
    
     2004-01-17  2004-01-23  2004-01-26  2004-02-07  2004-02-18  2004-02-24  2004-03-20  2004-03-27 
     0.60112115  0.80818151  0.64316904  0.06831874 -0.03085218 -0.05787362  0.34177806 -0.40876877 
    

    【讨论】:

    • 是数据框的head。我来看看rollmean 函数。
    猜你喜欢
    • 1970-01-01
    • 2014-02-17
    • 1970-01-01
    • 2020-05-29
    • 2017-09-02
    • 2011-03-08
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多