ComenzarEmpieza gratis

Última observación arrastrada

Cuando tienes datos ausentes en una serie temporal, una técnica común es arrastrar hacia adelante el último valor que no estaba ausente. Esto se conoce como last observation carried forward. Se puede expresar de forma natural con código iterativo. Aquí tienes una implementación en 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
}

Al igual que las medias móviles, es muy difícil vectorizar este código y mantenerlo legible. Sin embargo, como solo es un bucle for, se puede traducir fácilmente a C++.

na_locf1() está disponible en tu espacio de trabajo. Convierte esta función a C++ y asígnala a na_locf2().

Este ejercicio forma parte del curso

Optimizar código de R con Rcpp

Ver curso

Instrucciones del ejercicio

  • Inicializa current con el valor NA de NumericVector.
  • La condición del if debe comprobar si el elemento i-ésimo de x es un NA de NumericVector.
  • Cuando se cumpla esa condición, establece el elemento i-ésimo de res en current.
  • En caso contrario, asigna a current el elemento i-ésimo de x.

Ejercicio interactivo práctico

Prueba este ejercicio y completa el código de muestra.

#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
  )
*/
Editar y ejecutar código