如何在时间序列中插入缺失值,受连续 NA (R) 的数量限制?
How to interpolate missing values in a time series, limited by the number of sequential NAs (R)?
我在日期时间序列中缺少值。例如:
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)
}
任何帮助将不胜感激!
谢谢
为所有缺失日期添加行的函数:
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)
}
我在日期时间序列中缺少值。例如:
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)
}
任何帮助将不胜感激!
谢谢
为所有缺失日期添加行的函数:
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)
}