我有100多年的日常数据,看起来像是
01.01.1856 12
02.01.1956 9
03.01.1956 -12
04.01.1956 7
etc.
我希望计算这个庞大数据的30年运行平均值。我尝试将数据转换为时间序列,但仍然无法弄清楚如何去做。我更喜欢一种与使用data.frame有关的简单方法。
答案 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)
我还建议将RcppRoll
与dplyr
结合使用,这为计算滚动平均值,总和等提供了相当方便的解决方案。
# 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
函数使用了季度英国天然气消费数据。