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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 05:01:11