如何结合group_modify()与weighted.mean计算分组加权均值?
按分组计算加权均值的解决方案
一、用group_modify()实现需求
完全可以结合weighted.mean()和group_modify()完成计算。核心思路是先按treatment和question分组,再通过group_modify()对每个分组的子数据框调用加权均值函数:
library(tidyverse) x <- tibble::tribble( ~treatment, ~question, ~bin, ~weight, "first_name_of_treatment", "didyou", 1L, 5.6, "first_name_of_treatment", "didthey", 0L, 10.3, "first_name_of_treatment", "willyou", 1L, 45.1, "first_name_of_treatment", "willthey", 0L, 2.2, "first_name_of_treatment", "didntthey", 1L, 1.5, "another_t_name", "didyou", 0L, 93.4, "another_t_name", "didthey", NA, NA, "another_t_name", "willyou", 1L, 52.1, "another_t_name", "willthey", 0L, 3.9, "another_t_name", "didntthey", NA, NA ) # group_modify 实现代码 x %>% group_by(treatment, question) %>% group_modify(~ tibble(weighted_bin_mean = weighted.mean(.x$bin, .x$weight, na.rm = TRUE))) %>% ungroup()
代码说明:
group_modify()会将每个分组的子数据框传入.x参数- 调用
weighted.mean()时,指定.x$bin为待计算均值的列,.x$weight为权重列 na.rm = TRUE用来忽略包含NA值的行,避免计算报错
二、更简洁的替代方法:group_by() + summarize()
对于这种简单的汇总需求,group_modify()并非最优选择,直接用group_by()配合summarize()代码更简洁、可读性更强:
# 更优实现代码 x %>% group_by(treatment, question) %>% summarize(weighted_bin_mean = weighted.mean(bin, weight, na.rm = TRUE), .groups = "drop")
代码说明:
summarize()可以直接在分组上下文里调用weighted.mean(),无需处理子数据框.groups = "drop"用来计算完成后取消分组,返回普通的tibble结构
两种方法最终得到的结果完全一致,后者更适合这类单一汇总统计的场景。
内容的提问来源于stack exchange,提问作者C.Robin
相关产品推荐
相关产品推荐

