如何在R中检测数据列连续缺失值并关联PERIOD列筛选?
R实现缺失DAYS值的规则筛选
需求说明
处理数据集的DAYS列,找出缺失的DAYS编号,但需遵循以下规则:
- 若两行
DAYS之间的连续缺失值数量 +1 等于后一行的PERIOD值,则排除该区间的所有缺失值; - 不满足上述条件的缺失值则保留。
示例:
- DAYS=163和165之间缺失164(缺失数=1),后一行PERIOD=2(1+1=2),因此排除164;
- DAYS=170和172之间缺失171(缺失数=1),后一行PERIOD=1(1+1≠1),因此保留171。
示例数据集前28行
DAYS PERIOD 146 1 147 1 148 1 149 1 150 1 151 1 152 1 153 1 154 1 155 1 156 1 157 1 158 1 159 1 160 1 161 1 162 1 163 1 165 2 166 1 167 1 168 1 169 1 170 1 172 1 173 1 174 1 175 1
已完成步骤
你已完成以下代码,生成预期DAYS序列并初步找出缺失值:
# 生成预期的DAYS序列 expected_days <- seq(min(hs$DAYS), max(hs$DAYS)) # 找出初步缺失的DAYS值 missing_days <- setdiff(expected_days, hs$DAYS)
后续规则筛选实现
以下代码完成规则筛选,得到最终需要保留的缺失DAYS:
# 计算相邻DAYS的差值,标记存在缺失的行 hs$days_diff <- c(NA, diff(hs$DAYS)) # 筛选出存在缺失的行(差值>1的行,对应缺失区间的后一行) missing_intervals <- hs[hs$days_diff > 1, ] # 初始化需要排除的缺失值列表 exclude_days <- c() # 遍历每个缺失区间,判断是否需要排除缺失值 for (i in 1:nrow(missing_intervals)) { prev_day <- missing_intervals$DAYS[i] - missing_intervals$days_diff[i] curr_day <- missing_intervals$DAYS[i] # 计算当前区间的缺失天数 missing_count <- curr_day - prev_day - 1 # 检查是否符合排除规则:缺失数+1 == 后一行的PERIOD if (missing_count + 1 == missing_intervals$PERIOD[i]) { # 生成该区间的所有缺失值,加入排除列表 exclude_days <- c(exclude_days, seq(prev_day + 1, curr_day - 1)) } } # 从初步缺失值中去掉需排除的,得到最终保留的缺失DAYS final_missing_days <- setdiff(missing_days, exclude_days)
代码说明
diff(hs$DAYS)计算相邻DAYS的差值,差值>1说明两行之间存在缺失;- 对每个缺失区间,计算缺失天数,判断是否满足“缺失数+1=后一行PERIOD”的规则;
- 将符合规则的缺失值加入排除列表,最后通过
setdiff得到最终需要保留的缺失DAYS。
内容的提问来源于stack exchange,提问作者Shamim
相关产品推荐
相关产品推荐

