1. Learn
  2. /
  3. Courses
  4. /
  5. Tối ưu hóa mã R với Rcpp

Connected

Exercise

Giữ nguyên quan sát cuối cùng

Khi bạn có dữ liệu bị thiếu trong chuỗi thời gian, một kỹ thuật phổ biến là lấy giá trị hợp lệ gần nhất trước đó để điền vào. Cách làm này gọi là last observation carried forward (giữ nguyên quan sát cuối cùng). Cách diễn đạt tự nhiên là dùng mã lặp. Dưới đây là một triển khai bằng R:

na_locf1 <- function(x) {
  current <- NA  
  res <- x
  for(i in seq_along(x)) {
    if(is.na(x[i])) {
      # Replace with current
      res[i] <- current
    } else {
      # Set current 
      current <- x[i]
    }
  }  
  res
}

Giống như rolling means, rất khó để vector hóa đoạn mã này mà vẫn giữ được tính dễ đọc. Tuy nhiên, vì đây chỉ là một vòng lặp for, nên có thể dễ dàng dịch sang C++.

na_locf1() đã có sẵn trong không gian làm việc của bạn. Hãy chuyển nó sang C++ và gán cho na_locf2().

Instructions

100 XP
  • Khởi tạo current bằng giá trị NA của NumericVector.
  • Điều kiện if cần kiểm tra xem phần tử thứ i của x có phải là NA của NumericVector hay không.
  • Khi điều kiện đó đúng, gán phần tử thứ i của res bằng current.
  • Ngược lại, gán current bằng phần tử thứ i của x.