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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:28:09