R语言dplyr中用权重数据框对各列求均值及加权均值的方法
问题解答
1. 计算df每列对应权重列的加权均值
R base包内置了weighted.mean()函数可以直接计算加权均值,因为两个dataframe结构完全一致,可以逐列对应计算,base R实现代码如下:
# base R 实现 weighted_means <- mapply(weighted.mean, x = df, w = df_weights, na.rm = TRUE)
计算结果验证:
- Monday列加权均值:(110 + 110 + 10*1)/(10+10+1) = 30/21 ≈ 1.4286
- Tuesday列加权均值:(11 + 21 +3*1)/(1+1+1) = 6/3 = 2
2. 整合普通均值与加权均值到同一DataFrame
可以通过summarize_all传入包含两个计算函数的列表实现需求,也可以使用dplyr 1.0.0之后更推荐的across()语法实现,示例代码如下:
library(dplyr) # 方法1:使用summarize_all实现 result <- df %>% summarize_all( list( 普通均值 = function(x) mean(x, na.rm = TRUE), 加权均值 = function(x) weighted.mean(x, w = df_weights[[cur_column()]], na.rm = TRUE) ) ) # 方法2:更推荐的across语法实现 result <- df %>% summarize( across( .cols = everything(), .fns = list( 普通均值 = ~mean(.x, na.rm = TRUE), 加权均值 = ~weighted.mean(.x, w = df_weights[[cur_column()]], na.rm = TRUE) ) ) )
输出的result默认是宽表结构,每列对应原始df的列+统计类型命名,值为对应统计结果。如果需要调整为每行是统计类型、每列对应原始df列的结构,可以对结果做转置处理:
# 转置结果示例 result_t <- t(result) %>% as.data.frame() %>% setNames("统计值")
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

