milaske - 3 years ago 224
R Question

# Weighted mean calculation in R with missing values

Does anyone know if it is possible to calculate a weighted mean in R when values are missing, and when values are missing, the weights for the existing values are scaled upward proportionately?

To convey this clearly, I created a hypothetical scenario. This describes the root of the question, where the scalar needs to be adjusted for each row, depending on which values are missing.

Image: Weighted Mean Calculation

File: Weighted Mean Calculation in Excel

Using `weighted.mean` from the base `stats` package with the argument `na.rm = TRUE` should get you the result you need. Here is a `tidyverse` way this could be done:

``````library(tidyverse)
scores <- tribble(
~student, ~test1, ~test2, ~test3,
"Mark",     90,     91,     92,
"Mike",     NA,     79,     98,
"Nick",     81,     NA,     83)

weights <- tribble(
~test,   ~weight,
"test1",     0.2,
"test2",     0.4,
"test3",     0.4)

scores %>%
gather(test, score, -student) %>%
left_join(weights, by = "test") %>%
group_by(student) %>%
summarise(result = weighted.mean(score, weight, na.rm = TRUE))
#> # A tibble: 3 x 2
#>   student   result
#>     <chr>    <dbl>
#> 1    Mark 91.20000
#> 2    Mike 88.50000
#> 3    Nick 82.33333
``````
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download