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

Connected

Exercise

直前の観測値で補完する(LOCF)

時系列に欠損がある場合、よく使われる手法のひとつが、欠損でない直近の値を前方に引き継ぐ方法です。これは last observation carried forward(直前の観測値の前方補完、LOCF)と呼ばれます。反復処理で自然に表現できます。以下は 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
}

ローリング平均と同様に、このコードを読みやすさを保ったままベクトル化するのは難しいです。しかし、単なる for ループなので、C++ へは簡単に書き換えられます。

na_locf1() はワークスペースに用意されています。これを C++ に変換し、na_locf2() に代入してください。

Instructions

100 XP
  • current を NumericVector の NA 値で初期化します。
  • if 条件では、x の i 番目の要素が NumericVector の NA かどうかを確認します。
  • 条件が真のときは、res の i 番目の要素を current に設定します。
  • それ以外の場合は、current を x の i 番目の要素に更新します。