Začněte nyníZačněte zdarma

Přenesení poslední platné hodnoty dopředu

Když v časové řadě narazíš na chybějící data, jednou z běžných technik je přenést dopředu poslední hodnotu, která chybějící nebyla. Tato metoda se nazývá last observation carried forward. Přirozeně ji lze vyjádřit pomocí iterativního kódu. Zde je implementace v 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
}

Podobně jako u klouzavých průměrů je tento kód velmi obtížné vektorizovat a zároveň zachovat jeho čitelnost. Protože se ale jedná jen o smyčku for, lze ho snadno přepsat do C++.

Funkce na_locf1() je dostupná v tvém pracovním prostředí. Převeď ji do C++ a výsledek přiřaď funkci na_locf2().

Toto cvičení je součástí kurzu

Optimizing R Code with Rcpp

Zobrazit kurz

Pokyny k cvičení

  • Inicializuj proměnnou current na hodnotu NA typu NumericVector.
  • Podmínka if má ověřovat, zda je i-tý prvek vektoru x roven hodnotě NA typu NumericVector.
  • Pokud je podmínka splněna, nastav i-tý prvek vektoru res na hodnotu current.
  • V opačném případě nastav current na i-tý prvek vektoru x.

Interaktivní cvičení na vyzkoušení si v praxi

Vyzkoušejte si toto cvičení dokončením tohoto ukázkového kódu.

#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
  )
*/
Upravit a spustit kód