如何使用dplyr计算两个分组变量的加权平均值

10

我知道这一定很简单,但我找不到正确的dplyr命令来完成这个任务。假设我想按两个变量对数据集进行分组,然后总结每行的计数。我们可以使用以下代码:

mtcars %>% group_by(cyl, mpg) %>% summarize(Count = n())

这将生成一个数据框,包含三个变量、mpg和Count的27行。接下来我想做的是汇总每个三个cyl值的平均mpg,请注意每行可能包含一个大于1的Count,在计算平均值时必须考虑它。我的数据框应该有3行2列的cyl和Avg_mpg。请问是否有人可以给我提供短代码块来完成此操作? 非常感谢。

2个回答

9
如果我理解正确的话,您需要使用weighted.mean函数。
library(dplyr)
mtcars %>% 
   group_by(cyl, mpg) %>% 
   summarize(Count = n()) %>%
   group_by(cyl) %>%
   summarise(avg_mpg = weighted.mean(mpg, Count))

# A tibble: 3 x 2
#    cyl   avg_mpg
#  <dbl>   <dbl>
#1  4.00    26.7
#2  6.00    19.7
#3  8.00    15.1

这相当于

mtcars %>% 
  group_by(cyl, mpg) %>% 
  summarize(Count = n()) %>%
  group_by(cyl) %>%
  summarise(avg_mpg = sum(mpg * Count)/sum(Count))

1
这正是我所需的。谢谢你。 - ds_guy
我认为您应该使用mutate(Count = n())而不是summarize(Count = n()),这样权重列Count将在计算加权平均值之前添加到所有行中。否则,结果与仅按cyl分组的平均值完全相同。 - neilfws
@neilfws 我想我同意你的观点,但是代码的第一部分是由OP提供的,我不确定他们在实际数据中如何使用它。所以我会让OP决定如何使用它。谢谢 :) - Ronak Shah

1

由于权重是分组变量,因此您实际上正在执行一个简单的平均值:

library(dplyr)
options(pillar.sigfig=10) # To check they are identical results
    
mtcars %>%
  group_by(cyl) %>%
  summarise(avg_mpg = mean(mpg))

输出:

结果与上述提出的结果完全相同。

# A tibble: 3 x 2
    cyl     avg_mpg
  <dbl>       <dbl>
1     4 26.66363636
2     6 19.74285714
3     8 15.1  

如果您需要基于另一个变量的加权平均值:

mtcars %>%
  group_by(cyl) %>%
  summarise(avg_mpg = weighted.mean(mpg, disp))

# A tibble: 3 x 2
    cyl     avg_mpg
  <dbl>       <dbl>
1     4 25.81985300
2     6 19.77197631
3     8 14.86285148

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接