在R中如何按参与者分组统计问卷多选选项的各因子总数量?
R语言调研多选字段分组统计频次实现方案
基于你已经拆分完成的new_dat数据集,以下是可直接运行的实现方案,你提到的长表转换思路完全可行,这里提供优化后的版本和细节说明:
优化Tidyverse实现代码
library(tidyverse) new_dat %>% # 将C1-C5选择列转为长格式,仅保留分组、选择顺序、选项值三个字段 pivot_longer(cols = -group, names_to = "choose_order", values_to = "option") %>% # 过滤掉未选择产生的空值 filter(!is.na(option)) %>% # 按分组、选项维度统计选择次数 count(group, option, name = "select_count") %>% # 转为宽表展示,行对应选项,列对应分组,未出现的组合默认填充0 pivot_wider(names_from = group, values_from = select_count, values_fill = 0)
运行后即可得到你需要的统计结果,例如A组1号选项选择次数为1、4号选项选择次数为2,完全匹配需求。
代码优化点说明
- 用
filter提前剔除空值,无需后续单独调用na.omit - 用
count替代group_by + summarise的组合,代码更简洁易读 - 转宽表时通过
values_fill = 0参数直接补全所有缺失的分组-选项组合的次数为0,无需单独调用replace_na,也不需要手动指定分组名称,适配更多分组的扩展场景
可选基础R实现方案
如果你不想依赖第三方包,也可以用基础R的交叉表函数实现:
# 提取所有非空的选项值 option_vec <- unlist(new_dat[, paste0("C", 1:5)]) option_vec <- option_vec[!is.na(option_vec)] # 提取选项对应的分组信息 group_vec <- rep(new_dat$group, 5) group_vec <- group_vec[!is.na(unlist(new_dat[, paste0("C", 1:5)]))] # 生成交叉统计结果 stat_result <- table(group_vec, option_vec)
直接打印stat_result即可查看分组统计的频次数据。
内容的提问来源于stack exchange,提问作者N Kevin
相关产品推荐
相关产品推荐

