R语言中如何按ID计算指定选项被选中的百分比?
R按ID分组计算选项选中百分比实现方案
你之前用group_by没得到预期结果,绝大多数情况是分组后没有搭配正确的汇总统计逻辑,下面给两种可直接复用的实现方式:
方法1:tidyverse 方案(适配你已经在用的group_by语法)
首先加载tidyverse包,先构造和你场景匹配的示例数据,你可以替换成自己的真实数据:
library(tidyverse) # 长表结构示例(每行对应1个ID的1个选项选择记录) df <- tibble( ID = rep(c("A001", "A002", "A003"), each = 4), option = rep(c("选项1", "选项2", "选项3", "选项4"), 3), selected = c(1,0,1,0, 0,1,1,1, 1,1,0,0) # 1代表选中,0代表未选中 )
如果要统计每个ID下指定目标选项的选中百分比,正确写法如下:
# 替换成你需要统计的目标选项名称 target_opt <- "选项2" pct_result <- df %>% group_by(ID) %>% summarise( # 计算逻辑:分组内匹配目标选项且标记为选中的数量 / 分组总记录数 * 100 target_select_pct = sum(option == target_opt & selected == 1) / n() * 100 )
如果你的数据是宽表结构(每个ID占1行,每个选项单独为1列,值为1/0标记选中状态),写法可以简化:
# 宽表结构示例 df_wide <- tibble( ID = c("A001", "A002", "A003"), 选项1 = c(1,0,1), 选项2 = c(0,1,1), 选项3 = c(1,1,0), 选项4 = c(0,1,0) ) pct_result_wide <- df_wide %>% group_by(ID) %>% summarise( # 直接取目标选项列的均值乘100就是百分比 选项2_选中百分比 = mean(`选项2`) * 100 )
方法2:基础R方案(无需安装额外包)
不想加载第三方包的话,可以直接用基础R的aggregate函数实现分组统计:
# 长表基础R实现 target_opt <- "选项2" pct_result_base <- aggregate( selected ~ ID, data = df, FUN = function(x) { group_id <- parent.frame()$ID group_total <- length(x) match_idx <- which(df$ID == group_id & df$option == target_opt) sum(df$selected[match_idx] == 1) / group_total * 100 } )
常见踩坑说明
- 单独调用
group_by()不会直接输出分组计算结果,必须搭配summarise()(汇总输出每组1行结果)或mutate()(给原数据每一行追加分组计算值)才会生效,这是初学者最容易遇到的问题 - 如果你的选中状态是文本标记(比如"是"/"否"、"选中"/"未选中"),只需要把判断条件里的
selected == 1替换成对应文本匹配逻辑即可,比如selected == "是" - 计算百分比时注意分母要对应分组下的总样本量,不要用全表总样本量导致结果错误
内容的提问来源于stack exchange,提问作者kakashi araya
相关产品推荐
相关产品推荐

