如何用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
相关产品推荐
相关产品推荐

