시작하기무료로 시작하기

결측값 처리

R에서 결측값을 확인하려면 is.na(x)를 사용해야 해요. (x == NA를 시도하면 어떻게 될까요?)

Rcpp에서의 대응은 정적 메서드 is_na()입니다. 정적(static)이라는 것은 메서드가 특정 변수에 속하는 것이 아니라 클래스의 일부라는 뜻이에요. 예를 들어, NumericVector::is_na(x)double x가 결측값인지 검사합니다.
마찬가지로, 정적 메서드 get_na()는 해당 클래스의 NA 값을 제공합니다. 예를 들어, CharacterVector::get_na()는 결측 문자값을 반환해요.

C++에서 논리합(or)은 R과 동일하게 ||입니다.

이 연습은 강의의 일부입니다

Rcpp로 R 코드 최적화하기

강의 보기

연습 안내

  • 이전 연습 문제의 weighted_mean_cpp() 함수를 업데이트하여, xw에서 결측값을 발견하는 즉시 결측값을 반환하도록 하세요.
    • x의 i번째 원소가 NA이거나 w의 i번째 원소가 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)
*/
코드 편집 및 실행