如何根据R中的日期和时间计算移动平均线
How to calculate the moving average base on date and time in R
我上传了我的数据。
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))
最终输出将是包含这些不同移动平均线的绘图。
有人能帮帮我吗?
希望以下是一个令人满意的解决方案。
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()
使用动物园的 rollmeanr
功能以及 dplyr
的 across
可以帮助您解决这个问题。
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
我上传了我的数据。 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))
最终输出将是包含这些不同移动平均线的绘图。
有人能帮帮我吗?
希望以下是一个令人满意的解决方案。
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()
使用动物园的 rollmeanr
功能以及 dplyr
的 across
可以帮助您解决这个问题。
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