İleriye taşınan ortalama
Son gözlemi ileri taşımaya bir alternatif de NA değerlerini, önceki NA olmayan tüm değerlerin ortalamasıyla değiştirmektir. Buna de ileri taşınan ortalama denir. Yine R'de okunabilirlik ve hız arasında seçim yapmamız gerekiyor. Aşağıdaki kod okunabilirlik için yazılmıştır:
na_meancf1 <- function(x) {
total_not_na <- 0
n_not_na <- 0
res <- x
for(i in seq_along(x)) {
if(is.na(x[i])) {
res[i] <- total_not_na / n_not_na
} else {
total_not_na <- total_not_na + x[i]
n_not_na <- n_not_na + 1
}
}
res
}
Yinelemeli yapısı vektörleştirmeyi zorlaştırıyor, bu yüzden bunu C++'a çevirelim. na_meancf2() tanımını, na_meancf1() fonksiyonunun C++ çevirisi olarak tamamla.
Bu egzersiz, kursun bir parçasıdır
Rcpp ile R Kodunu Optimize Etme
Egzersiz talimatları
ifkoşulunda,x'ini. elemanının birNumericVector'ınNA'si olup olmadığını kontrol et.- Koşul doğruysa,
i. sonucu, kaçırılmayan değerlerin toplamıtotal_not_nayı, kaçırılmayan değerlerin sayısın_not_naya bölerek ayarla. - Aksi halde,
total_not_nayıx'ini. elemanı kadar artır ven_not_naya1ekle.
Uygulamalı etkileşimli egzersiz
Bu egzersizi bu örnek kodu tamamlayarak deneyin.
#include
using namespace Rcpp;
// [[Rcpp::export]]
NumericVector na_meancf2(NumericVector x) {
double total_not_na = 0.0;
double n_not_na = 0.0;
NumericVector res = clone(x);
int n = x.size();
for(int i = 0; i < n; i++) {
// If ith value of x is NA
if(___) {
// Set the ith result to the total of non-missing values
// divided by the number of non-missing values
res[i] = ___ / ___;
} else {
// Add the ith value of x to the total of non-missing values
___;
// Add 1 to the number of non-missing values
___;
}
}
return res;
}
/*** R
library(microbenchmark)
set.seed(42)
x <- rnorm(1e5)
x[sample(1e5, 100)] <- NA
microbenchmark(
na_meancf1(x),
na_meancf2(x),
times = 5
)
*/