如何在dplyr::summarise中筛选子集完成统计计算
错误原因
代码出现行数异常、计算结果不符合预期的核心问题有2个:
- 占比计算的分母逻辑错误:
Total[atleast_6m == T]的写法,是对长度为1的汇总值Total按逐行的逻辑向量atleast_6m取子集,最终会返回和组内原始行数等长的向量,导致summarise无法按单值聚合,直接拆成多行并产生大量NA。实际上占比的分母是每个type分组下atleast_6m == TRUE的样本总数,不是总样本量Total的子集。 working_at_6m的判断逻辑缺少约束:第二个判断分支未限定is.na(fail),可能把已有失效记录、但不满足“失效时长≥6个月”的样本误判,导致计数偏差。
正确实现代码
library(dplyr) library(lubridate) q_sum <- q %>% ungroup() %>% group_by(type) %>% summarise( Total = n(), # 计算满足6个月观测周期的样本量(占比分母) eligible_count = sum(atleast_6m, na.rm = TRUE), # 统计满足6个月正常工作的样本数 working_at_6m = sum( case_when( # 有失效记录,且创建到失效的间隔≥6个月 !is.na(fail) & interval(create, fail) / months(1) >= 6 ~ TRUE, # 无失效记录、为当前unit最后一条记录,且创建到截止日期的间隔≥6个月 last_for_unit == TRUE & is.na(fail) & interval(create, last) / months(1) >= 6 ~ TRUE, # 其余情况均不满足要求 TRUE ~ FALSE ), na.rm = TRUE ), # 计算占比 `working_at_6m%` = working_at_6m / eligible_count, .groups = "drop" )
结果验证
运行上述代码后输出完全匹配预期:
- type=a:Total=7,working_at_6m=4,占比≈0.667
- type=b:Total=2,working_at_6m=2,占比=1
内容的提问来源于stack exchange,提问作者Mark Davies
相关产品推荐
相关产品推荐

