Weighted mean (C++ version)
Time to put your skills into action by creating a function to calculate the weighted mean of a vector.
Given a numeric vector of data values, x
, and another numeric vector of weights, w
, the weighted mean is the sum of the data value times the weights divided by the sum of the weights. Note that x
and w
should have the same number of elements.
In R, it is calculated with weighted.mean()
, which does sum(x * w) / sum(w)
.
This exercise is part of the course
Optimizing R Code with Rcpp
Exercise instructions
- Complete the definition of the
weighted_mean_cpp()
function.- Initialize
total_xw
andtotal_w
to zero, andn
to the size ofx
. - Specify the arguments to the
for
loop, with an integer,i
as the counter. - Inside the loop, add the ith weight to
total_w
and the ith data value times the ith weight tototal_xw
. - Return the total product divided by the total weight.
- Initialize
Hands-on interactive exercise
Have a go at this exercise by completing this sample code.
#include
using namespace Rcpp;
// [[Rcpp::export]]
double weighted_mean_cpp(NumericVector x, NumericVector w) {
// Initialize these to zero
double total_w = ___;
double total_xw = ___;
// Set n to the size of x
int n = ___;
// Specify the for loop arguments
for(int i = 0; ___) {
// Add ith weight
total_w += ___;
// Add the ith data value times the ith weight
total_xw ___;
}
// Return the total product divided by the total weight
return ___;
}
/*** R
x <- c(0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11)
w <- 1 / seq_along(x)
weighted_mean_cpp(x, w)
# Does the function give the same results as R's weighted.mean() function?
all.equal(weighted_mean_cpp(x, w), weighted.mean(x, w))
*/