如何在时间序列中插入缺失值,受连续NAs(R)数量的限制?

时间:2018-03-13 17:13:38

标签: r time-series interpolation missing-data

我在一系列日期中缺少值。例如:

set.seed(101)

df <- data.frame(DATE = as.Date(c('2012-01-01', '2012-01-02', 
'2012-01-03', '2012-01-05', '2012-01-06', '2012-01-15', '2012-01-18', 
'2012-01-19', '2012-01-20', '2012-01-22')),
                 VALUE = rnorm(10, mean = 5, sd = 2))

如何编写一个函数来填充第一个和最后一个日期之间的所有缺失日期(即2012-01-01和2012-01-22'),然后使用插值(线性和平滑样条曲线)来填充缺失值,但不超过3个连续缺失值(即2012-01-06和2012-01-15之间没有插值)?

该功能将应用于非常大的数据帧。我已经能够编写一个函数,使用线性插值来填充两个日期之间的所有缺失值(见下文),但我无法弄清楚如何阻止它插入长的缺失值。

interpolate.V <- function(df){

  # sort data by time 
  df <- df[order(df$DATE),]

  # linnearly interpolate VALUE for all missing DATEs
  temp <- with(df, data.frame(approx(DATE, VALUE, xout = seq(DATE[1], 
               DATE[nrow(df)], "day"))))
  colnames(temp) <- c("DATE", "VALUE_INTERPOLATED")
  temp$ST_ID <- df$ST_ID[1]
  out <- merge(df, temp, all = T)
  rm(temp)

  return(out)
}

任何帮助将不胜感激!

由于

1 个答案:

答案 0 :(得分:1)

为所有缺失日期添加行的函数:

date.range <- function(sub){

  sub$DATE <- as.Date(sub$DATE)
  DATE <- seq.Date(min(sub$DATE), max(sub$DATE), by="day")
  all.dates <- data.frame(DATE)
  out <- merge(all.dates, sub, all = T)

  return(out)
}

使用带有maxgap参数的zoo包中的na.approx或na.spline:

interpolate.zoo <- function(df){
  df$VALUE_INT <- na.approx(df$VALUE, maxgap = 3, na.rm = F)
  return(df)
}