始める無料で始める

欠損値の扱い

R では、欠損値を判定するには is.na(x) を使います。(x == NA を試すとどうなるでしょうか?)

Rcpp での同等の機能は静的メソッド is_na() です。静的とは、そのメソッドが特定の変数ではなくクラスに属していることを意味します。たとえば、NumericVector::is_na(x)double 型の x が欠損値かどうかを判定します。 同様に、静的メソッド get_na() は対応するクラスの NA を返します。たとえば、CharacterVector::get_na() は文字の欠損値を返します。

C++ の論理和は R と同じく || である点に注意してください。

この演習はコースの一部です

Rcpp で R コードを最適化する

コースを見る

演習の手順

  • 前の演習で作成した weighted_mean_cpp() 関数を更新し、x または w に欠損値が見つかった時点で、ただちに欠損値を返すようにします。
    • xi 番目の要素が NA か、または wi 番目の要素が NA かをチェックする if ブロックを追加します。
    • その if ブロックの中で、数値の NA を返します。

実践的なインタラクティブ演習

このサンプルコードを完成させて、この演習に挑戦してみましょう。

#include 
using namespace Rcpp;

// [[Rcpp::export]]
double weighted_mean_cpp(NumericVector x, NumericVector w) {
  double total_w = 0;
  double total_xw = 0;
  
  int n = x.size();
  
  for(int i = 0; i < n; i++) {
    // If the ith element of x or w is NA then return NA
    ___
    
    
    total_w += w[i];
    total_xw += x[i] * w[i];
  }
  
  return total_xw / total_w;
}

/*** R 
x <- c(0, 1, 3, 6, 2, 7, 13, NA, 12, 21, 11)
w <- 1 / seq_along(x)
weighted_mean_cpp(x, w)
*/
コードを編集して実行