如何在R中按组计算二分诊断变量的占比并合并至原数据集?
问题
我有如下R语言数据集:diagnosis_2_or_more与diagnosis_3_or_more为二分变量,1代表“是”,0代表“否”。
id <- c(1,2,3,4,5,6,7) grp <- c("1","1","1","2","2","3","3") diagnosis_2_or_more <- c(1,1,0,1,0,1,0) diagnosis_3_or_more <- c(1,0,1,1,1,0,1) df <- data.frame(id,grp,diagnosis_2_or_more,diagnosis_3_or_more)
我需要按grp分组,计算每组中患有2种及以上诊断、3种及以上诊断的人员占比,并将占比结果添加到原数据集的对应行中,期望输出如下:
id <- c(1,2,3,4,5,6,7) grp <- c("1","1","1","2","2","3","3") diagnosis_2_or_more <- c(1,1,0,1,0,1,0) diagnosis_3_or_more <- c(1,0,1,1,1,0,1) perc_2_or_more <- c(0.67,0.67,0.67,0.5,0.5,0.5,0.5) perc_3_or_more <- c(0.67,0.67,0.67,0.5,1,0.5,0.5) df <- data.frame(id,grp,diagnosis_2_or_more,diagnosis_3_or_more,perc_2_or_more,perc_3_or_more)
例如,分组1中2种及以上诊断的占比为2/3(2为该组中对应变量为1的人数,3为分组总人数)。请问是否可以通过group by和summarize或其他方法实现该需求?
解决方案
方法1:使用dplyr包(推荐)
不需要单独用summarize,直接用group_by配合mutate就能高效完成需求——summarize会聚合分组生成单行结果,而mutate会保留原数据结构,把分组计算的占比自动填充到该组的每一行。
代码示例:
library(dplyr) df_result <- df %>% group_by(grp) %>% mutate( # 二分变量的均值就是1的占比(因为1代表是,0代表否) perc_2_or_more = mean(diagnosis_2_or_more), perc_3_or_more = mean(diagnosis_3_or_more) ) %>% ungroup() %>% # 取消分组状态,避免后续操作默认按grp分组 mutate( # 可选:保留两位小数,和示例输出格式一致 perc_2_or_more = round(perc_2_or_more, 2), perc_3_or_more = round(perc_3_or_more, 2) ) print(df_result)
运行后输出完全匹配你期望的结果。
方法2:使用base R(无需额外包)
如果不想加载第三方包,可以用ave函数实现分组计算并自动填充到对应行:
df_result_base <- df # ave函数按grp分组计算均值,结果长度与原数据一致 df_result_base$perc_2_or_more <- round(ave(df$diagnosis_2_or_more, df$grp, FUN = mean), 2) df_result_base$perc_3_or_more <- round(ave(df$diagnosis_3_or_more, df$grp, FUN = mean), 2) print(df_result_base)
补充:使用group_by+summarize+merge的方法
如果你一定要用summarize,可以先分组生成汇总占比表,再通过merge合并回原数据集:
sum_df <- df %>% group_by(grp) %>% summarize( perc_2_or_more = round(mean(diagnosis_2_or_more),2), perc_3_or_more = round(mean(diagnosis_3_or_more),2) ) %>% ungroup() df_result_merge <- merge(df, sum_df, by = "grp")
此方法也能得到目标结果,但步骤比直接用mutate繁琐,因此更推荐前两种方法。
内容的提问来源于stack exchange,提问作者Bruh
相关产品推荐
相关产品推荐

