【问题标题】:How to calculate the moving average base on date and time in R如何根据R中的日期和时间计算移动平均值
【发布时间】:2021-02-18 22:35:06
【问题描述】:

我上传了我的数据。 https://filebin.net/a29fn87b8wpfnos0/Plume_2.csv?t=iouc5vg7

在 csv 文件格式中看起来像这样

我试图寻找适合我数据的正确答案。 没找到,自己试了一个月左右才解决。

首先我需要做一个移动平均:

  • 30 分钟
  • 1 小时
  • 1 天
  • 1 周

对于每个 PM2.5、PM10、NO2

但是,我无法使用这种类型的代码手动执行此操作:

Plume_2$PM2.5_30min_ <- TTR ::SMA(Plume_2$pm2.5, n=31)
Plume_2$PM2.5_1hour_ <- TTR ::SMA(Plume_2$pm2.5, n=61)
Plume_2$PM2.5_1day_ <- TTR ::SMA(Plume_2$pm2.5, n=1441)
Plume_2$PM2.5_1week_ <- TTR ::SMA(Plume_2$pm2.5, n=10080)

使用这些代码,n 值不符合我的日期。

也使用了这个代码,似乎平均值不太好。

library(runner)
dates = Plume_2$timestamp
value = Plume_2$PM2.5_Plume2

Plume_2$MA <-  mean_run(x = value, k = 7, lag = 1, idx = as.Date(dates))

最终输出将是包含这些不同移动平均线的绘图图。

有人可以帮帮我吗?

【问题讨论】:

    标签: r moving-average


    【解决方案1】:

    我希望以下是一个令人满意的解决方案。

    library(data.table)
    dt <- fread("https://filebin.net/a29fn87b8wpfnos0/Plume_2.csv?t=phgmlykh")
    dt[,.(timestamp,
          PM2.5_30min_mean = frollmean(PM2.5_Plume2,31),
          PM2.5_1hour_mean = frollmean(PM2.5_Plume2,61),
          PM2.5_1day_mean = frollmean(PM2.5_Plume2, 1441),
          PM2.5_1week_mean = frollmean(PM2.5_Plume2,10080))]
    

    结果显示为

    然后我想使用 ggplot 绘制结果。这里我选择PM2.5_30min作为例子。

    library(lubriate) # turn timestamp into POSIXct format with dmy_hm function
    ggplot(dt2, aes(dmy_hm(timestamp), PM2.5_1hour_mean,na.rm = TRUE)) +
      geom_line() + 
      scale_x_datetime()
    

    【讨论】:

    • 开头的frollmean产生了错误。但是,我更改了时间格式,并且工作得很好。感谢 ggplot 提示。我将使用它来代替 norma R 绘图函数。
    【解决方案2】:

    使用 zoo 的 rollmeanr 函数以及来自 dplyracross 可以帮助您解决此问题。

    library(dplyr)
    library(zoo)
    
    df <- read.csv('https://filebin.net/a29fn87b8wpfnos0/Plume_2.csv?t=up70ngy3')
    
    
    df %>%
      mutate(across(PM2.5_Plume2:NO2_Plume2, 
                   list(avg_30min = ~rollmeanr(.x, 30, fill = NA), 
                        avg_hour =  ~rollmeanr(.x, 60, fill = NA), 
                        avg_day =  ~rollmeanr(.x, 1440, fill = NA), 
                        avg_week =  ~rollmeanr(.x, 10080, fill = NA)))) -> result
    
    result
    

    【讨论】:

    • 你很摇滚。工作完美。非常感谢
    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2020-07-04
    • 2013-09-11
    • 2018-10-25
    • 1970-01-01
    相关资源
    最近更新 更多