Kom igångKom igång gratis

Sista observationen förs framåt

När det finns saknade värden i en tidsserie är en vanlig teknik att föra framåt det senaste värde som inte saknades. Detta kallas last observation carried forward. Metoden lämpar sig naturligt för iterativ kod. Här är en implementering i 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
}

Precis som rullande medelvärden är den här koden svår att vektorisera utan att göra den svårläst. Eftersom det rör sig om en for-slinga kan den däremot enkelt översättas till C++.

na_locf1() finns redan i din arbetsmiljö. Konvertera den till C++ och tilldela resultatet till na_locf2().

Den här övningen är en del av kursen

Optimera R-kod med Rcpp

Visa kurs

Övningsinstruktioner

  • Initiera current till NA-värdet för NumericVector.
  • if-villkoret ska kontrollera om det ite elementet i x är ett NumericVector-NA.
  • När villkoret är sant, sätt det ite elementet i res till current.
  • Annars, sätt current till det ite elementet i x.

Interaktiv övning med praktiskt arbete

Testa den här övningen genom att slutföra den här exempelkoden.

#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
  )
*/
Redigera och kör kod