如何在R语言中计算4列Yes/No数据的占比?
解决方案
你的问题出在分组逻辑错误:把所有列都加入group_by后,每个唯一的行组合会被单独分组,而summarise里没有指定统计规则,自然无法得到目标结果。要实现你要的统计效果,需要先把宽格式数据转成长格式,再分组计数,步骤如下:
1. 加载必要包
首先确保安装并加载dplyr和tidyr:
install.packages(c("dplyr", "tidyr")) library(dplyr) library(tidyr)
2. 数据转换与统计
用以下代码实现目标输出:
open_data_portals_summary <- ogd_research_project_csv_col_names_clean %>% # 选中需要统计的Yes/No列 select(Opd_Portal, Opd_MobileApps, Opd_CustomerServicePortal) %>% # 把宽格式转成长格式:将各服务列转为"服务类型"和"响应"两列 pivot_longer(cols = everything(), names_to = "服务类型", values_to = "响应") %>% # 按服务类型和响应(Yes/No)分组,统计数量 group_by(`服务类型`, 响应) %>% summarise(数量 = n(), .groups = "drop") %>% # 转回宽格式,让Yes/No作为列,匹配目标输出样式 pivot_wider(names_from = 响应, values_from = 数量, values_fill = 0) %>% # 增加总计列 mutate(总计 = Yes + No)
代码说明
pivot_longer:把多列的Yes/No数据合并成两列(服务类型、响应),这是统计多列分类数据的关键步骤;group_by + summarise:按服务类型和Yes/No分组,统计每组的行数(即数量);pivot_wider:把统计结果转回宽格式,让Yes和No作为单独列,和你要的输出样式一致;mutate:计算每个服务类型的总样本数。
如果你的目标是按机构网站分组统计各服务的Yes/No情况,只需调整代码,保留Opd_InstitutionWebsite列并加入分组即可:
open_data_portals_by_inst <- ogd_research_project_csv_col_names_clean %>% select(Opd_InstitutionWebsite, Opd_Portal, Opd_MobileApps, Opd_CustomerServicePortal) %>% pivot_longer(cols = -Opd_InstitutionWebsite, names_to = "服务类型", values_to = "响应") %>% group_by(Opd_InstitutionWebsite, `服务类型`, 响应) %>% summarise(数量 = n(), .groups = "drop") %>% pivot_wider(names_from = 响应, values_from = 数量, values_fill = 0)
内容的提问来源于stack exchange,提问作者John Keya
相关产品推荐
相关产品推荐

