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
Anleitung zur Übung
- Initialisiere
currentmit demNA-Wert vonNumericVector. - Die
if-Bedingung soll prüfen, ob dasi. Element vonxeinNAeinesNumericVectorist. - Wenn die Bedingung wahr ist, setze das
i. Element vonresaufcurrent. - Andernfalls setze
currentauf dasi. Element vonx.
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
)
*/