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
Övningsinstruktioner
- Initiera
currenttillNA-värdet förNumericVector. if-villkoret ska kontrollera om detite elementet ixär ettNumericVector-NA.- När villkoret är sant, sätt det
ite elementet irestillcurrent. - Annars, sätt
currenttill detite elementet ix.
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
)
*/