결측값 처리
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()함수를 업데이트하여,x나w에서 결측값을 발견하는 즉시 결측값을 반환하도록 하세요.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)
*/