如何使用summarise_each计算加权平均值?

5
我该如何使用dplyr中的summarise_each函数计算数据集中所有字段的加权平均值?例如,我们想按对数据集进行分组,并计算其中所有列的加权平均值,其中权重取为列。我尝试了以下方法,但无法使其正常工作。
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

非常感谢您的帮助!

1个回答

16
为了帮助理解这里正在发生什么。让我们创建一个返回其参数长度的小函数。
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)

非常感谢您提供详细的答案。 - Caner

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