BaşlayınÜcretsiz başlayın

Son gözlemi ileri taşıma

Bir zaman serisinde eksik verilerin olduğunda, yaygın bir teknik, eksik olmayan son değeri ileri taşımaktır. Buna son gözlemi ileri taşıma denir. Bu yaklaşım doğal olarak yinelemeli kodla ifade edilebilir. İşte R ile bir uygulaması:

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
}

Yuvarlanan ortalamalarda olduğu gibi, bu kodu okunabilirliğini koruyarak vektörleştirmek gerçekten zordur. Ancak bu sadece bir for döngüsü olduğundan, C++'a kolayca çevrilebilir.

na_locf1() çalışma alanında sağlanmıştır. Bunu C++'a çevir ve na_locf2()'ye ata.

Bu egzersiz, kursun bir parçasıdır

Rcpp ile R Kodunu Optimize Etme

Kursa Göz Atın

Egzersiz talimatları

  • currentNumericVector'ın NA değeriyle başlat.
  • if koşulu, x'in i. elemanının NumericVector'ın NA'si olup olmadığını kontrol etmeli.
  • Bu koşul doğruysa, res'in i. elemanını current olarak ayarla.
  • Aksi halde, currentx'in i. elemanına ayarla.

Uygulamalı etkileşimli egzersiz

Bu egzersizi bu örnek kodu tamamlayarak deneyin.

#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
  )
*/
Kodu Düzenle ve Çalıştır