首页 > 解决方案 > dplyr“加权和”和cross()

问题描述

我已经在这里问了一个与此类似的问题,答案如下。我想按“数字”聚合我的数据框并计算加权平均值。现在我想做一个加权和,但不知何故我不知道如何将加权和应用于我的数据框。weighted.sum 函数不再适用于我的 R 版本。

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')




标签: r

解决方案


我们可以使用

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
 

推荐阅读