微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何根据R中的日期和时间计算移动平均值

如何解决如何根据R中的日期和时间计算移动平均值

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

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

enter image description here

我试图寻找适合我的数据的正确答案。 我找不到,我自己花了大约一个月的时间才解决

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

  • 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))

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

有人可以帮我吗?

解决方法

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

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))]

结果如图 enter image description here

然后我想使用 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()
,

使用zoo 的rollmeanr 函数和across 中的dplyr 可以帮助您解决这个问题。

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,avg_day =  ~rollmeanr(.x,1440,avg_week =  ~rollmeanr(.x,10080,fill = NA)))) -> result

result

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。