1. Learn
  2. /
  3. Courses
  4. /
  5. Rcpp で R コードを最適化する

Connected

Exercise

平均値の繰り上げ(Mean carried forward)

最後の観測値の繰り上げ(last observation carried forward)の代わりに、NA をそれまでの非 NA 値の平均で置き換える方法もあります。これは「平均値の繰り上げ(mean carried forward)」と呼ばれます。ここでも、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
}

反復的な処理のためベクトル化は難しいので、代わりに C++ に書き換えましょう。na_meancf1() を C++ に翻訳した na_meancf2() の定義を完成させてください。

Instructions

100 XP
  • if の条件では、x の i 番目の要素が NumericVector の NA かどうかを確認してください。
  • 条件が真の場合、結果の i 番目を、欠損でない値の合計 total_not_na を、欠損でない値の個数 n_not_na で割った値に設定します。
  • それ以外の場合は、total_not_na に x の i 番目の要素を加え、n_not_na に 1 を加えてください。