如何用dplyr创建年龄分组并按组计算死亡率?
问题分析与修正方案
原代码的核心问题
- 分组区间逻辑错误:原
breaks设置遗漏了4-14岁区间,导致该年龄段数据被标记为NA;同时分界点未覆盖所有高龄数据,59岁以上的部分样本可能无法被正确分组。 - 分组维度冗余:
group_by中包含idade字段,会让每个单独年龄成为独立分组,彻底偏离“按年龄组统计”的目标。 - 代码风格冗余:单独创建分组变量再传入
mutate,不符合dplyr管道化的最佳实践。
修正后的代码
方案1:保留所有年龄区间(含5-14岁)
如果需要处理所有年龄样本,可补充中间分组:
df_mortalidade <- painel_mortalidade %>% # 直接在管道内创建年龄分组,调整分界点确保区间准确 mutate(faixas_etarias = cut(idade, breaks = c(0, 1, 5, 15, 30, 60, Inf), labels = c("1岁以下", "1-4岁", "5-14岁", "15-29岁", "30-59岁", "59岁以上"), include.lowest = TRUE)) %>% # 过滤有效覆盖率数据,同时排除未匹配分组的样本 filter(perc_cobert_sf > 0, !is.na(faixas_etarias)) %>% # 仅按年龄组、年份分组,移除单独年龄字段 group_by(faixas_etarias, ano) %>% # 统计死亡率均值,自动忽略NA值 summarise(tx_mortalidade_idade = mean(tx_mortalidade, na.rm = TRUE), .groups = "drop")
方案2:仅保留目标分组(忽略4-14岁)
如果确认数据源中无4-14岁样本,或直接过滤该区间:
df_mortalidade <- painel_mortalidade %>% mutate(faixas_etarias = cut(idade, breaks = c(0, 1, 15, 30, 60, Inf), labels = c("1岁以下", "1-4岁", "15-29岁", "30-59岁", "59岁以上"), include.lowest = TRUE)) %>% filter(perc_cobert_sf > 0, !is.na(faixas_etarias)) %>% group_by(faixas_etarias, ano) %>% summarise(tx_mortalidade_idade = mean(tx_mortalidade, na.rm = TRUE), .groups = "drop")
关键调整说明
- 分界点优化:用
5替代原4确保1-4岁区间包含4岁;添加Inf覆盖所有高龄样本,避免遗漏。 - 分组维度精简:移除
idade字段,仅保留年龄组和年份作为分组依据,实现按组统计的目标。 - NA值处理:
mean中加入na.rm = TRUE避免死亡率字段的NA值干扰统计结果;.groups = "drop"自动取消分组,避免后续操作冲突。
内容的提问来源于stack exchange,提问作者Alex Gois
相关产品推荐
相关产品推荐

