Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

dplyr "weighted sum" and across()

Tags:

r

I have already asked a similar question to this here with the answer below. I wanted to aggregate my dataframe by "number" and calculate a weighted mean. Now I would like to do a weighted sum but somehow I cannot find out how to apply a weighted sum to my dataframe. The weighted.sum function doesn no longer work for my R version.

df = data.frame(number=c("a","a","a","b","c","c"), y=c(1,2,3,4,1,7),
                z=c(2,2,6,8,9,1), weight =c(1,1,3,1,2,1))

df %>%
  group_by(number) %>%
  summarise(across(c(y, z), 
                   list( mean = ~mean(., na.rm = TRUE), sd = ~sd(., na.rm = TRUE),
                         weighted = ~weighted.mean(., w = weight))), .groups = 'drop')




like image 794
titeuf Avatar asked Oct 23 '25 18:10

titeuf


1 Answers

We could use

library(dplyr)
df %>%
   group_by(number) %>%
   summarise(across(c(y, z), 
                    list( mean = ~mean(., na.rm = TRUE),
                          sd = ~sd(., na.rm = TRUE),
                          weighted = ~weighted.mean(., w = weight), 
                          weightedsum = ~ sum(. * weight)), .groups = 'drop'))
# A tibble: 3 x 9
#  number y_mean  y_sd y_weighted y_weightedsum z_mean  z_sd z_weighted z_weightedsum
#  <chr>   <dbl> <dbl>      <dbl>         <dbl>  <dbl> <dbl>      <dbl>         <dbl>
#1 a           2  1           2.4            12   3.33  2.31       4.4             22
#2 b           4 NA           4               4   8    NA          8                8
#3 c           4  4.24        3               9   5     5.66       6.33            19
 
like image 75
akrun Avatar answered Oct 26 '25 07:10

akrun