移动平均线

时间:2016-01-16 10:57:01

标签: r moving-average

我有100多年的日常数据,看起来像是

01.01.1856   12
02.01.1956   9
03.01.1956   -12
04.01.1956    7
etc. 

我希望计算这个庞大数据的30年运行平均值。我尝试将数据转换为时间序列,但仍然无法弄清楚如何去做。我更喜欢一种与使用data.frame有关的简单方法。

2 个答案:

答案 0 :(得分:1)

我想考虑到一些傻瓜的准备是困难的。 因此,在使用已提及的包runmean的函数require(caTools)之前,我尝试展示一些准备方法。 首先,我们创建示例数据(这对您来说不是必需的,但是为了理解)。 其次,我将数据框划分为数据框列表,每年一个,并取每年的平均值。这两个步骤可以立即完成,但我认为分离的方式更容易理解和适应。

#example data
Days        <- seq(as.Date("1958-01-01"), as.Date("2015-12-31"), by="days")
Values      <- runif(length(Days))
DF          <- data.frame(Days = Days, Values = Values)
#start of script
Years       <- format(DF$Days, "%Y")
UniqueYears <- unique(format(DF$Days, "%Y"))
#Create subset of years
#look for every unique year which element of days is in this year.
YearlySubset <- lapply(UniqueYears, function(x){
              DF[which(Years == x), ]
            })
YearlyMeanValues <- sapply(YearlySubset, function(x){
              mean(x$Values)
            })

现在应用了运行平均值:

#install.packages("caTools")
require(caTools)
RM <- data.frame(Years = UniqueYears, RunningMean30y = runmean(YearlyMeanValues, 30))

如果我一开始没有找到你并且你想要在30年内每天都有一些奔跑的意思,当然你可以这样做:

RM <- cbind(DF, runmean(DF$Values, 365 * 30))

考虑到你创建时间序列的问题:

DF[ , 1] <- as.Date(DF[ , 1], format = "%Y.%m.%d")

答案 1 :(得分:1)

我还建议将RcppRolldplyr结合使用,这为计算滚动平均值,总和等提供了相当方便的解决方案。

代码

# Libs
library(RcppRoll)  # 'roll'-ing functions for R vectors and matrices.
library(dplyr)     # data grammar (convenience)
library(zoo)       # time series (convenience)
library(magrittr)  # compound assignment pipe-operator (convenience)

# Data 
data("UKgas")
## Convert to data frame to make example better
UKgas <- data.frame(Y = as.matrix(UKgas), date = time(UKgas))

# Calculations
UKgas %<>%
    # To make example more illustrative I converted the data to a quarterly format
    mutate(date = as.yearqtr(date)) %>% 
    arrange(date) %>%
    # The window size can be changed to reflect any period
    mutate(roll_mean = roll_mean(Y, n = 4, align = "right", fill = NA))

注释

由于示例中提供的数据非常适度,我通过data包中的utils函数使用了季度英国天然气消费数据。