7

我知道这一定非常简单,但我很难找到正确的 dplyr 命令来执行此操作。假设我想按两个变量对数据集进行分组,然后汇总每一行的计数。为此,我们只需:

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

这将为三个变量cylmpg和生成一个包含 27 行的数据框Count。接下来我想做的是总结mpg三个值中每一个的cyl平均值。请记住,每一行可能包含Count大于一个,在计算平均值时必须考虑这一点。我的数据框应该有 3 行 2 个变量cyl,并且Avg_mpg. 有人可以给我一个短代码卡盘吗?先感谢您。

4

2 回答 2

8

如果我对你的理解正确,你需要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))
于 2018-04-24T01:20:27.980 回答
0

您正在有效地执行简单的平均值,因为权重是分组变量:

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
于 2022-02-04T10:24:39.327 回答