【问题标题】:How to use dplyr to calculate a weighted mean of two grouped variables如何使用 dplyr 计算两个分组变量的加权平均值
【发布时间】:2018-10-04 03:30:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: r dplyr weighted-average summarize split-apply-combine


    【解决方案1】:

    如果我对你的理解正确,你需要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))
    

    【讨论】:

    • 这正是我所需要的。谢谢。
    • 我认为您需要使用mutate(Count = n()),而不是summarize(Count = n()),以便在计算加权平均值之前将加权列Count 添加到所有行中。否则结果与仅由cyl 分组的平均值完全相同。
    • @neilfws 我想我同意你的观点,但是代码的第一部分由 OP 提供,我不确定他们如何在真实数据中使用它。所以我会把它留给 OP 来决定如何使用它。不过谢谢:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2018-03-21
    • 2010-10-04
    • 1970-01-01
    • 2021-02-03
    相关资源
    最近更新 更多