用平均值填补时间序列中的空白

Bet*_*oo8 4 r time-series

我有一个像这样的数据帧:

day         sum_flux  samples mean
2005-10-26     0.02     48    0.02
2005-10-27     0.12     12    0.50
Run Code Online (Sandbox Code Playgroud)

这是一系列5年的日常阅读,但有些日子不见了.我想用其他年份的平均月份来填补这些日子.

即如果缺少26-10-2005我想要使用数据集中所有Octobers的平均值.如果整个十月都不见了,我想把这个平均值应用到每个缺失的一天.

我想我需要构建一个函数(可能使用plyr)来评估日期.但是我在使用R中的各种时间序列对象时非常缺乏经验,并且有条件地对数据进行子集化并希望得到一些建议.特别是关于我应该使用哪种类型的时间序列.

非常感谢

Ric*_*ton 6

一些样本数据.我假设那sum_flux是具有缺失值的列,并且您想要计算值.

library(lubridate)
days <- seq.POSIXt(ymd("2005-10-26"), ymd("2010-10-26"), by = "1 day")
n_days <- length(days)
readings <- data.frame(
  day      = days,
  sum_flux = runif(n_days),
  samples  = sample(100, n_days, replace = TRUE),
  mean     = runif(n_days)
)
readings$sum_flux[sample(n_days, floor(n_days / 10))] <- NA
Run Code Online (Sandbox Code Playgroud)

添加月份列.

readings$month <- month(readings$day, label = TRUE)
Run Code Online (Sandbox Code Playgroud)

使用tapply得到的月平均流量.

monthly_avg_flux <- with(readings, tapply(sum_flux, month, mean, na.rm = TRUE))
Run Code Online (Sandbox Code Playgroud)

每当缺少助焊剂时使用此值,或者如果没有则保持助焊剂.

readings$sum_flux2 <- with(readings, ifelse(
  is.na(sum_flux), 
  monthly_avg_flux[month], 
  sum_flux
))
Run Code Online (Sandbox Code Playgroud)