使用data.table计算各ID首次出现指定Status的天数
高效实现方法(基于data.table)
针对你的需求,完全不需要嵌套循环,利用data.table的分组聚合特性就能高效完成。以下是两种简洁且性能优异的实现方式:
方法一:条件过滤后聚合+补全缺失值
# 定义目标状态 target_status <- 'C' # 步骤1:筛选出目标状态的记录,按ID分组取最小day(首次出现的天数) result <- DT[Status == target_status, .(first_day = min(day)), by = ID] # 步骤2:补全所有ID,未出现目标状态的设为0 result <- DT[, .(ID = unique(ID))][result, on = .(ID)][is.na(first_day), first_day := 0] # 查看结果 result
输出结果:
ID first_day 1: 1 0 2: 2 3 3: 3 4
方法二:分组内直接判断计算
target_status <- 'C' result <- DT[, .(first_day = { # 提取当前ID下所有目标状态对应的day days <- day[Status == target_status] # 若存在则取最小值,否则返回0 if (length(days) > 0) min(days) else 0 }), by = ID] result
这个方法在分组内部直接完成判断和计算,代码更紧凑,同样高效。
性能优势说明
data.table的分组操作基于底层C语言优化实现,避免了R层面循环的额外开销,尤其是在处理大规模数据集时,性能比嵌套循环高出几个数量级。
内容的提问来源于stack exchange,提问作者H_A
相关产品推荐
相关产品推荐

