You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何结合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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 18:35:36