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

如何用R的dplyr包对分组不均衡的分类数据计算均值?

解决分类数据的平均选择次数计算问题

核心误区分析

你之前的问题出在两个关键点:

  • 仅按id分组统计各选项次数,但没有跨所有id计算这些次数的平均值
  • 忽略了「部分id未选择某选项」的情况,这类选项在对应id中的计数应为0,不补全的话会导致均值计算偏差

正确计算步骤(dplyr+tidyr实现)

我们需要先统计每个id内各选项的出现次数,补全缺失选项的0值,再对所有id求平均。

1. 加载依赖包

library(dplyr)
library(tidyr)

2. 统计每个id内各选项的出现次数

counts_per_id <- df %>%
  count(id, m_ex, name = "count")

这一步会得到每个id对应每个选项的选择次数,比如id1的a出现2次、b出现2次等。

3. 补全每个id的所有选项(缺失项填0)

因为有些id没有选择某些选项(比如id2没选a),需要把这些缺失的组合补全并设计数为0,保证每个id都包含所有m_ex选项:

counts_complete <- counts_per_id %>%
  complete(id, m_ex, fill = list(count = 0))

4. 计算各选项的平均选择次数

按m_ex分组,对所有id的计数求均值:

mean_result <- counts_complete %>%
  group_by(m_ex) %>%
  summarize(mean_count = mean(count))

最终结果

运行后会得到:

print(mean_result)
# # A tibble: 3 × 2
#   m_ex  mean_count
#   <chr>      <dbl>
# 1 a           1.33
# 2 b           1.33
# 3 c           1

简化实现(用pivot_wider)

也可以用宽格式转换的方式一步到位:

df %>%
  count(id, m_ex) %>%
  pivot_wider(names_from = m_ex, values_from = n, values_fill = 0) %>%
  summarize(across(a:c, mean)) %>%
  pivot_longer(cols = everything(), names_to = "m_ex", values_to = "mean_count")

内容的提问来源于stack exchange,提问作者honeyimhome

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 01:10:28