我对使用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::summarise
函数,您可能已经加载了plyr
包并使用了plyr::summarise
。 - det