Вот один из способов сделать это:
Сначала мы выполним линейное приближение, которое оставит нас со всеми хвостами NA
-с слева и справа:
x <- na.approx(x, method = "constant", f = 0.5,na.rm = F)
Теперь давайте найдем не-NA-вектор и связанные с ним крайние левые и правые члены приращения арифметической прогрессии:
x_c <- x[!is.na(x)]
left <- x_c[1] - x_c[2]
right <- x_c[length(x_c)] - x_c[length(x_c) - 1]
Теперь пришло время заполнить левый и правый NA
-ы числами, полученными арифметикойпрогрессия:
ind_x<- which(!is.na(x))
big_M <- 100
x[(ind_x[length(ind_x)]):length(x)] <- seq(x[ind_x[length(ind_x)]],
sign(right) * big_M,
right)[1:(length(x) - ind_x[length(ind_x)] + 1)]
x[ind_x[1]:1] <- seq(x[ind_x[1]],sign(left) * big_M,left)[1:ind_x[1]]
y <- x
, где big_M
- определяемое пользователем большое число, которое не будет превышено арифметической прогрессией, учитывая базовые данные.
Ввод - вывод:
x <- c(NA, -1, 1,-1, 1, NA, -1, 2, NA, NA)
> y
[1] -3 -1 1 -1 1 0 -1 2 5 8
x <- c(NA,NA,NA, -1, 1,-1, 1, NA, -1, 2, NA, NA,NA)
> y
[1] -7 -5 -3 -1 1 -1 1 0 -1 2 5 8 11
x <- c(NA,NA,NA, 5,1, 1,-1, 1, NA, -1, 2, NA, NA,NA)
> y
[1] 17 13 9 5 1 1 -1 1 0 -1 2 5 8 11