MulaiMulai sekarang secara gratis

Last observation carried forward

Ketika Anda memiliki data hilang dalam deret waktu, teknik umum adalah meneruskan nilai terakhir yang tidak hilang. Ini dikenal sebagai last observation carried forward. Pendekatan ini wajar diekspresikan dengan kode iteratif. Berikut implementasi menggunakan 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
}

Seperti rerata berjalan, sangat sulit memvektorisasi kode ini sambil tetap terbaca. Namun, karena ini hanya sebuah for loop, ia dapat dengan mudah diterjemahkan ke C++.

na_locf1() telah disediakan di ruang kerja Anda. Konversikan ke C++ dan tetapkan sebagai na_locf2().

Latihan ini adalah bagian dari kursus

Mengoptimalkan Kode R dengan Rcpp

Lihat Kursus

Petunjuk latihan

  • Inisialisasi current ke nilai NA milik NumericVector.
  • Kondisi if harus memeriksa apakah elemen ke-i dari x adalah NA milik NumericVector.
  • Saat kondisi tersebut benar, setel elemen ke-i dari res ke current.
  • Jika tidak, setel current ke elemen ke-i dari x.

Latihan interaktif praktis

Cobalah latihan ini dengan menyelesaikan kode contoh berikut.

#include 
using namespace Rcpp;

// [[Rcpp::export]]
NumericVector na_locf2(NumericVector x) {
  // Initialize to NA
  double current = ___::___();
  
  int n = x.size();
  NumericVector res = clone(x);
  for(int i = 0; i < n; i++) {
    // If ith value of x is NA
    if(___::___(___)) {
      // Set ith result as current
      res[i] = ___;
    } else {
      // Set current as ith value of x
      current = ___;
    }
  } 
  return res ;
}

/*** R
  library(microbenchmark)
  set.seed(42)
  x <- rnorm(1e5)
  # Sprinkle some NA into x
  x[sample(1e5, 100)] <- NA  
  microbenchmark( 
    na_locf1(x), 
    na_locf2(x), 
    times = 5
  )
*/
Edit dan Jalankan Kode