如何用dplyr统计各年龄存活人数并合并当前年龄ID计数
优化dplyr实现年龄存活数统计的方案
需求回顾
- 从包含
ID、Age、YearDied的数据集,统计每个年龄对应的SurvivorNumber:若某ID的Age为n,则该ID视为度过了1至n的所有年龄,需统计各年龄的总存活数 - 同时将结果与各年龄的
Current Number of IDs(当前该年龄的ID数量)合并
初始代码问题分析
你当前的代码存在大量冗余操作:重复调用group_by和case_when完全没有必要,count(Age)已经完成了按年龄分组计数,后续多次分组操作不会改变结果,反而降低代码效率和可读性。
优化实现方案
下面是更简洁高效的dplyr实现,核心思路是利用累计求和计算存活数,同时一步完成两个指标的合并:
# 1. 计算各年龄的当前ID数量,并确保Age为数值型以正确排序 current_df <- inputDf %>% # 若Age原本是字符型,先转换为数值型避免排序错误 mutate(Age = as.numeric(Age)) %>% count(Age, name = "CurrentNumber") %>% arrange(Age) # 2. 计算各年龄的存活数:对当前ID数从大到小累计求和 final_result <- current_df %>% arrange(desc(Age)) %>% mutate(SurvivorNumber = cumsum(CurrentNumber)) %>% arrange(Age) %>% # 整理列顺序,可按需调整 select(Age, CurrentNumber, SurvivorNumber)
代码解释
- CurrentNumber计算:
count(Age)直接得到每个年龄对应的当前ID数量,重命名为CurrentNumber更直观 - SurvivorNumber计算:先按
Age降序排列,用cumsum累计求和——因为年龄为n的ID必然包含了所有1到n年龄的存活记录,累计求和后再升序排列,就得到每个年龄k对应的总存活数(所有年龄≥k的ID总数) - 如果数据集里有存活状态(
YearDied为NA)的ID,只要Age字段是其当前年龄,上述逻辑依然适用,无需额外处理
内容的提问来源于stack exchange,提问作者Bugsy
相关产品推荐
相关产品推荐

