Ultima observație propagată înainte
Când ai date lipsă într-un șir de timp, o tehnică frecvent folosită este să propagăm înainte ultima valoare disponibilă. Aceasta se numește ultima observație propagată înainte (last observation carried forward). Poate fi exprimată natural prin cod iterativ. Iată o implementare în 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
}
Ca și în cazul mediilor mobile, vectorizarea acestui cod este dificilă fără a sacrifica lizibilitatea. Totuși, fiindcă este doar o buclă for, poate fi tradus cu ușurință în C++.
na_locf1() este disponibil în spațiul tău de lucru. Convertește-l în C++ și atribuie rezultatul funcției na_locf2().
Acest exercițiu face parte din cursul
Optimizarea codului R cu Rcpp
Instrucțiuni pentru exercițiu
- Inițializează
currentcu valoareaNAa tipuluiNumericVector. - Condiția
iftrebuie să verifice dacă elementul cu indiceleidinxeste unNAde tipNumericVector. - Când condiția este adevărată, setează elementul cu indicele
idinresla valoareacurrent. - În caz contrar, setează
currentla elementul cu indiceleidinx.
Exercițiu interactiv practic
Încearcă acest exercițiu completând acest cod de exemplu.
#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
)
*/