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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 02:06:26