[英]R query - Is it possible to use "sapply" and the "weighted.mean" function together?
[英]Weighted means for groups in r - using aggregate and weighted.mean functions together
我正在尝试计算所有数字变量的组变量 X1 的加权平均值,这里是一些示例数据
set.seed(123)
X1=rep(c("A", "B", "C"), each = 4)
Y1=as.numeric(seq(1,12,by=1))
Y2=sample(1:5,12,TRUE)
Y3=sample(10:20,12,TRUE)
wgt <- abs(rnorm(12)*10)
df <- data.frame(X1,Y1,Y2,Y3,wgt)
这是我一直用来计算 X1 的常规平均值的代码
aggregate( df[, sapply(df, is.numeric)] , by=list(df$X1) , FUN=mean, na.rm=TRUE)
我想计算权重均值,权重变量是wgt 。 我尝试了这两种代码,但都不起作用。 我尝试了多种不同的方法,但没有任何效果。
aggregate( df[, sapply(df, is.numeric)] , by=list(df$X1) , FUN=weighted.mean(x, w=df$wgt), na.rm = TRUE)
aggregate( df[, sapply(df, is.numeric)] , by=list(df$X1) , FUN=weighted.mean, w=df$wgt, na.rm = TRUE)
我无法调整weighted.mean function。谁能告诉我哪里出错了? 这个 function 甚至可以在这种情况下使用吗? 任何帮助是极大的赞赏。 谢谢
这是一种使用by()
调用的aggregate
来计算加权均值的方法。
res <- by(df, df$X1, function(DF){
aggregate(cbind(Y1, Y2, Y3) ~ X1, DF, function(y, w)
weighted.mean(y, w = DF[['wgt']], na.rm = TRUE))
})
do.call(rbind, res)
# X1 Y1 Y2 Y3
#A A 2.152503 2.633935 18.93457
#B B 6.677851 3.589251 16.90102
#C C 10.194695 2.638378 16.70958
您可以使用outer
横向应用weighted.mean
。
gr <- c("A", "B", "C"); ys <- c("Y1", "Y2", "Y3")
WF <- Vectorize(function(x, y) with(df[df$X1 %in% x, ], weighted.mean(get(y), wgt)))
res <- `dimnames<-`(outer(gr, ys, WF), list(gr, ys))
res
# Y1 Y2 Y3
# A 2.152503 2.633935 18.93457
# B 6.677851 3.589251 16.90102
# C 10.194695 2.638378 16.70958
这是一个dplyr
解决方案,它返回与@Rui 相同的答案。 根据要求,这将对所有数字变量进行操作,而不管它们的列名如何。
df %>%
group_by(X1) %>%
summarise(across(where(is.numeric),
~ weighted.mean(.x, wgt),
.names = "weighted_mean_{.col}"))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.