【问题标题】:How do I compute weighted average using summarise_each?如何使用 summarise_each 计算加权平均值?
【发布时间】:2015-04-02 03:02:04
【问题描述】:

如何使用 dplyr 中的 summarise_each 计算数据集中所有字段的加权平均值?例如,假设我们要按 cylmtcars 数据集进行分组,并计算将权重作为 gear 的所有列的加权平均值> 栏目。我尝试了以下方法,但无法正常工作。

mtcars %>% group_by(cyl) %>% summarise_each(funs(weighted.mean(., gear)))

# The line above gives the following output
# Error in weighted.mean.default(c(1, 2, 2, 1, 2, 1, 1, 1, 2, 2, 2), 4.15555555555556) : 
# 'x' and 'w' must have the same length

提前感谢您的帮助!

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    帮助了解这里发生了什么。让我们做一个小功能 返回其参数的长度

    lenxy <- function(x,y)
        paste0(length(x),'-',length(y))
    

    然后将其应用到summarise_each,如:

    mtcars %>% group_by(cyl) %>% summarise_each(funs(lenxy(., qsec)))
    
    #>   cyl   mpg  disp    hp  drat    wt  qsec   vs   am gear carb
    #> 1   4 11-11 11-11 11-11 11-11 11-11 11-11 11-1 11-1 11-1 11-1
    #> 2   6   7-7   7-7   7-7   7-7   7-7   7-7  7-1  7-1  7-1  7-1
    #> 3   8 14-14 14-14 14-14 14-14 14-14 14-14 14-1 14-1 14-1 14-1
    

    看看这张表,你可以看到 第一个和第二个参数在qseq 之前是相同的,然后 后记 lenxy 的第二个参数长度为 1,即结果 事实上 dplyr 确实对数据进行操作,替换每个 带有摘要的字段,而不是创建新的 data.fame。

    解决方法很简单:从摘要中排除权重变量:

    mtcars %>% 
        group_by(cyl) %>% 
        summarise_each(funs(weighted.mean(., gear)),
                       -gear)
    

    【讨论】:

    • 非常感谢您的详细解答。
    猜你喜欢
    • 2010-10-04
    • 1970-01-01
    • 2011-02-12
    • 2021-11-24
    • 2017-01-06
    • 2021-11-28
    • 2016-05-10
    • 2012-06-14
    • 2016-04-07
    相关资源
    最近更新 更多