LoslegenKostenlos loslegen

Letzte Beobachtung fortschreiben

Wenn in einer Zeitreihe Daten fehlen, wird häufig die letzte vorhandene Beobachtung nach vorne fortgeschrieben. Das nennt man Last Observation Carried Forward. Das lässt sich sehr gut mit iterativem Code ausdrücken. Hier ist eine Implementierung in 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
}

Ähnlich wie bei gleitenden Mittelwerten ist es schwierig, diesen Code zu vektorisieren und dabei lesbar zu halten. Da es sich jedoch nur um eine for-Schleife handelt, lässt er sich leicht in C++ übertragen.

na_locf1() steht dir in deinem Workspace zur Verfügung. Übersetze es in C++ und weise es na_locf2() zu.

Diese Übung ist Teil des Kurses

R-Code mit Rcpp optimieren

Kurs anzeigen

Anleitung zur Übung

  • Initialisiere current mit dem NA-Wert von NumericVector.
  • Die if-Bedingung soll prüfen, ob das i. Element von x ein NA eines NumericVector ist.
  • Wenn die Bedingung wahr ist, setze das i. Element von res auf current.
  • Andernfalls setze current auf das i. Element von x.

Interaktive Übung

Vervollständige den Beispielcode, um diese Übung erfolgreich abzuschließen.

#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
  )
*/
Code bearbeiten und ausführen