1. Učit se
  2. /
  3. Kurzy
  4. /
  5. Optimizing R Code with Rcpp

Connected

cvičení

Průměr přenesený dopředu

Alternativou k přenášení poslední platné hodnoty dopředu je nahrazení NA průměrem všech předchozích hodnot, které nejsou NA. Tato metoda se nazývá mean carried forward (průměr přenesený dopředu). R nás i zde nutí volit mezi čitelností a rychlostí. Následující implementace je psaná s důrazem na čitelnost:

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
}

Iterativní povaha tohoto kódu ztěžuje jeho vektorizaci, proto ho raději převedeme do C++. Dokonči definici funkce na_meancf2() — jde o přepis na_meancf1() do C++.

Pokyny

100 XP
  • V podmínce if zkontroluj, zda je i-tý prvek vektoru x hodnotou NA typu NumericVector.
  • Pokud je podmínka splněna, nastav i-tý výsledek na součet hodnot bez chybějících dat, total_not_na, vydělený jejich počtem, n_not_na.
  • V opačném případě zvyš total_not_na o i-tý prvek vektoru x a přičti 1 k n_not_na.