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
Pokyny k cvičení
- Inicializuj proměnnou
currentna hodnotuNAtypuNumericVector. - Podmínka
ifmá ověřovat, zda jei-tý prvek vektoruxroven hodnotěNAtypuNumericVector. - Pokud je podmínka splněna, nastav
i-tý prvek vektoruresna hodnotucurrent. - V opačném případě nastav
currentnai-tý prvek vektorux.
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
)
*/