R语言统计从最后一周开始的连续终端缺失周数的实现方法
解决代码(基于data.table)
先构造示例数据并运行核心计算逻辑:
library(data.table) # 读取示例数据 df <- fread(text = "week county tot_pct 1 1 2 2 1 3.5 3 1 4 4 1 NA 5 1 NA 6 1 8 7 1 9 8 1 9.3 9 1 NA 10 1 NA 1 2 NA 2 2 4 3 2 9 4 2 NA 5 2 NA 6 2 9.3 7 2 10 8 2 11 9 2 13 10 2 14.5 1 3 2 2 3 7 3 3 8.2 4 3 9 5 3 10 6 3 11.2 7 3 NA 8 3 NA 9 3 NA 10 3 NA") # 核心计算逻辑 result <- df[order(county, -week), .(term_miss_weeks = { rl <- rleid(is.na(tot_pct)) ifelse(is.na(tot_pct[1]), sum(rl == rl[1]), 0) }), by = county] # 输出验证 print(result)
运行后输出和预期完全一致:
county term_miss_weeks 1: 1 2 2: 2 0 3: 3 4
逻辑说明
- 先按
county分组,组内按week倒序排列,确保每个区县的最大周数据排在分组第一行 - 用
rleid(is.na(tot_pct))生成连续相同NA状态的分组ID,所有连续NA会被分到同一个ID,连续非NA也会被分到同一个ID - 判断倒序后第一行(也就是最大周的数据)是否为NA:如果不是直接返回0;如果是,统计当前分组的行数,就是从最大周开始连续NA的数量
原代码问题
原来的代码没有对周次倒序排列,也没有限定只取最大周开始的首个连续NA分组,额外加的lag筛选条件也会过滤掉起始的NA值,所以无法得到正确结果。
内容的提问来源于stack exchange,提问作者bziggy
相关产品推荐
相关产品推荐

