Dữ liệu demo:

Demo dữ liệu có 6 ngày từ ngày 7 tới ngày 12, trong đó tại ngày 8 và ngày 9 bị khuyết dữ liệu (missing data)

demo_data <- data.frame(
  x = seq(as.Date('2023-05-07'), as.Date('2023-05-12'), by = 'day'),
  y = c(100, NA, NA, 200, 300, 400)
)

demo_data

1. Forward fill

Dùng giá trị của ngày phía trước để điền vào giá trị khuyết thiếu của ngày phía sau

Ví dụ: khi điền ngày 8 và ngày 9 ta sẽ lấy giá trị từ ngày 7

Sử dụng package zoo

library(zoo)
## 
## Attaching package: 'zoo'
## The following objects are masked from 'package:base':
## 
##     as.Date, as.Date.numeric
na.locf(demo_data)

2. Backward fill

Dùng giá trị của ngày phía sau để điền vào giá trị khuyết thiếu của ngày phía trước

Ví dụ: khi điền ngày 8 và ngày 9 ta sẽ lấy giá trị từ ngày 10

na.locf(demo_data, fromLast = TRUE)

3. Interpolate

Giá trị khuyết của ngày 8 và ngày 9 được điền bằng cách lấy trung bình có trong số là khoảng cách của ngày 8 và ngày 9 tới 2 ngày liền kề là ngày 7 và ngày 10

Trong đó: với ngày càng gần ngày bị missing thì có trọng số cao hơn

Ví dụ: khi điền ngày 8 thì ngày 7 có trọng số cao hơn ngày 10

Công thức:

\[ y = \frac{y_1(x_2-x) + y_2(x - x_1)}{x_2 - x_1} \]

# Ví dụ tính giá trị y khi x ở ngày 8/5
(100*(10 - 8) + 200*(8 - 7))/(10 - 7)
## [1] 133.3333
#interpolate y khi x ở ngày 8/5
approx(demo_data$x, demo_data$y, xout=as.Date('2023-05-08'))
## $x
## [1] "2023-05-08"
## 
## $y
## [1] 133.3333
# Ví dụ tính giá trị y khi x ở ngày 8/5
(100*(10 - 9) + 200*(9 - 7))/(10 - 7)
## [1] 166.6667
#interpolate y khi x ở ngày 9/5
approx(demo_data$x, demo_data$y, xout=as.Date('2023-05-09'))
## $x
## [1] "2023-05-09"
## 
## $y
## [1] 166.6667
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
mutate(
  demo_data, 
  y = case_when(
    is.na(y) ~ approx(demo_data$x, demo_data$y, xout = x)$y,
    TRUE ~ y
  )
)