Get startedGet started for free

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

View Course

Exercise instructions

  • Complete the definition of the weighted_mean_cpp() function.
    • Initialize total_xw and total_w to zero, and n to the size of x.
    • 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 to total_xw.
    • Return the total product divided by the total weight.

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))
*/
Edit and Run Code