使用dplyr计算各组的加权平均数(并复制其他方法)

3

我对使用dplyr计算加权平均数的语法感到混乱。

我正在遵循David在这里的建议。该语法非常透明,因此很有吸引力,但它似乎不按照我预期的那样工作:下面计算的是整个数据的加权平均值,而不是按B变量进行分组。

head(df)
# A tibble: 4 × 3
      A     B     P
  <dbl> <dbl> <dbl>
1     1    10   0.4
2     2    10   0.6
3     1    20   0.2
4     2    20   0.8

library(dplyr)
df %>% group_by(B) %>%
    summarise(wm = weighted.mean(A, P))
# wm
# 1 1.7

我可以用其他几种方法达到期望的结果。如何使用 dplyr 复制下面的计算?

# with a slit/apply routine:
sapply(split(df, df$B), function(x) weighted.mean(x$A, x$P))
#  10  20 
# 1.6 1.8 

# with data.table
library(data.table)
setDT(df)[, .(wm = weighted.mean(A, P)), B]
#     B  wm
# 1: 10 1.6
# 2: 20 1.8

# with plyr:
library(plyr)
ddply(df, .(B), summarise, wm = weighted.mean(A, P))
#    B  wm
# 1 10 1.6
# 2 20 1.8

# with aggregate | the formula approach is mysterious
df$wm <- 1:nrow(df)
aggregate(wm ~ B, data=df, function(x) weighted.mean(df$A[x], df$P[x]))
#    B  wm
# 1 10 1.6
# 2 20 1.8
df$wm <- NULL  # no longer needed


这是一个玩具数据(使用 tibble,而不是标准的 dataframe):
library(tidyverse)
df = structure(list(A = c(1, 2, 1, 2), B = c(10, 10, 20, 20), P = c(0.4, 0.6, 0.2, 0.8)), 
    row.names = c(NA, -4L), class = c("tbl_df", "tbl", "data.frame"))

这里有一个另一个使用dplyr计算分组均值的帖子,但我没有看到它们如何解决我的问题。


3
尝试使用 dplyr::summarise 函数,您可能已经加载了 plyr 包并使用了 plyr::summarise - det
你说得完全正确。你想把这个作为答案发布吗?我的意思是,这是一个愚蠢的错误,但也有点有趣... - PatrickT
1个回答

4

当加载plyr包时,经常会发生这种情况,因为plyr::summarise可能会覆盖dplyr::summarise函数。只需使用dplyr::summarise即可。如果summarise输出意外结果,这是要检查的第一件事。

另一种方法是在使用dplyr之前分离plyr包:

detach("package:plyr")
library("dplyr")
df %>% group_by(B) %>%
    summarise(wm = weighted.mean(A, P))
#       B    wm
#    <dbl> <dbl>
# 1    10   1.6
# 2    20   1.8


我有一个 Rmd 文档,在其中加载了 tidyversedplyr,但没有加载 plyr,而且这个问题也出现了!不确定是 tidyverse 还是其他包有一个比 dplyr::summarise 更优先的 summarise 函数。虽然如此,对我来说唯一的解决方法是使用 dplyr::summarise - PatrickT

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