Last observation carried forward
Ketika Anda memiliki data hilang dalam deret waktu, teknik umum adalah meneruskan nilai terakhir yang tidak hilang. Ini dikenal sebagai last observation carried forward. Pendekatan ini wajar diekspresikan dengan kode iteratif. Berikut implementasi menggunakan 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
}
Seperti rerata berjalan, sangat sulit memvektorisasi kode ini sambil tetap terbaca. Namun, karena ini hanya sebuah for loop, ia dapat dengan mudah diterjemahkan ke C++.
na_locf1() telah disediakan di ruang kerja Anda. Konversikan ke C++ dan tetapkan sebagai na_locf2().
Latihan ini adalah bagian dari kursus
Mengoptimalkan Kode R dengan Rcpp
Petunjuk latihan
- Inisialisasi
currentke nilaiNAmilikNumericVector. - Kondisi
ifharus memeriksa apakah elemen ke-idarixadalahNAmilikNumericVector. - Saat kondisi tersebut benar, setel elemen ke-
idarireskecurrent. - Jika tidak, setel
currentke elemen ke-idarix.
Latihan interaktif praktis
Cobalah latihan ini dengan menyelesaikan kode contoh berikut.
#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
)
*/