BaşlayınÜcretsiz başlayın

İ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

Kursa Göz Atın

Egzersiz talimatları

  • if koşulunda, x'in i. elemanının bir NumericVector'ın NA'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_nax'in i. elemanı kadar artır ve n_not_naya 1 ekle.

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
  )
*/
Kodu Düzenle ve Çalıştır