我正在使用 R。我知道计算移动平均线是一个在这个网站上有几个答案的主题,但我有一些问题使我的问题独一无二。
我有一个数据框,包括 8784 小时(366 天 * 24 小时)的空气污染物(臭氧)浓度。此数据框包含一些 NaN 值(缺失值)。该过程包含以下步骤:
1-计算每小时浓度的8小时移动(滚动)平均值:即每8个浓度应该以这种方式平均:1到8的平均值,2到9的平均值,3到10的平均值等。这导致获得每天(每 24 小时)有 24 个移动平均线。
2- 对于每一天,我想要最大的 8 小时移动平均线:即在 24 条移动平均线中,应该选择最大的数字。最后,将选择 366 条移动平均线(366 天)。
3- 应创建一个包含 366 个移动平均线的新数据框。
我知道有一些包(openair、zoo、TTR)可以做这样的事情,但是有没有办法在没有任何包的情况下编写代码?
An Exmaple of my data
ColName
1 18.76
2 12.92
3 8.12
4 NaN
5 12.92
6 3.77
7 18.76
8 9.52
9 94.09
10 18.76
11 14.13
12 8.12
13 2.04
14 12.92
15 9.17
.
.
.
8783 34.58
8784 64.23
主数据框的名称是“Hourly”。我尝试了这些代码:
Hourly1 <- c(0, cumsum(ifelse(is.nan(Hourly), 0, Hourly)))
rsum <- (Hourly1[(Hourly1+1):length(Hourly1)] - Hourly1[1:(length(Hourly1) - 8)]) / 8
但是当我尝试第一行时,会出现以下错误:
Error in is.nan(Hourly) : default method not implemented for type 'list'
更新:我使用了以下代码,但 8 小时平均值的最大值计算不正确:
Hourly2<-as.numeric(Hourly$Average)
names(Hourly2) <- rep(seq.Date(as.Date("2017-01-01"), by=1, length.out=366), each=24)
x<-Hourly2
#use cumsum to get the moving average, keep NaNs
cx <- c(0, cumsum(ifelse(is.nan(x), 0, x))) + c(0,x)*0
n <- 8
rsum <- (cx[(n+1):length(cx)] - cx[1:(length(cx) - n)]) / n
res <- data.frame(mov_avg=rsum, days=names(rsum))
#select max from each day, ignoring NaN's
mx <- aggregate(mov_avg~days, data=res, max)
我将最终结果(最多 366 个 8 小时平均值,每年 1 天)与标准预先批准的数据集进行了比较。在某些日子里,代码计算的平均值是正确的,但在其他日子里却不是!我没有明白它的逻辑。
你可以在这里找到我的原始数据集!
更新 2:
这是下载不同方法产生的最终结果的链接!
更新3:
结果之间的差异是由于计算移动平均线的方法不同。计算移动平均线的方法有左、右、中三种。这里的家伙提出的代码遵循“正确”的方法。