基于多条件生成Quality Flag列的R代码问题求助
问题分析与代码修正
原代码中判断连续相同yield的逻辑存在错误,未能正确识别连续3年及以上相同值的分组,也未将这些分组内的所有年份标记为1。以下是修正后的完整代码及说明:
library(dplyr) # 核心修正:先按市政和年份排序(必须确保年份有序,否则连续判断无效) df <- yield_area_long %>% arrange(CODE, year) %>% group_by(CODE) %>% # 标记当前年份yield是否与前一年相同 mutate( same_as_prev = yield == lag(yield, default = first(yield)), # 生成连续相同yield的分组ID:每次yield变化时分组ID递增 consecutive_group = cumsum(!same_as_prev) ) %>% # 统计每个连续分组的年份数量 group_by(CODE, consecutive_group) %>% mutate(group_length = n()) %>% # 回到市政维度处理标记逻辑 group_by(CODE) %>% mutate( # 连续3年及以上相同则标记为1,其余为0 consecutive_flag = ifelse(group_length >= 3, 1, 0), # 保留原异常值标记逻辑 outlier_flag = case_when( abs(yield - mean(yield, na.rm = TRUE)) > 3 * sd(yield, na.rm = TRUE) ~ 2, TRUE ~ 0 ), # 优先级:异常值(2) > 连续相同(1) > 正常(0) Quality_Flag = pmax(consecutive_flag, outlier_flag) ) %>% ungroup() %>% # 清理临时辅助列 select(-same_as_prev, -consecutive_group, -group_length, -consecutive_flag, -outlier_flag)
关键修正点
- 强制排序:先按
CODE和year排序,确保数据按市政的年份顺序排列,这是连续年份判断的前提。 - 连续分组识别:通过
same_as_prev和consecutive_group生成连续相同yield的分组ID,准确区分不同的连续值区间。 - 分组长度判断:统计每个连续分组的年份数量,只要分组长度≥3,就将组内所有行标记为1。
- 优先级处理:用
pmax确保异常值标记(2)的优先级高于连续相同标记(1),最后是正常状态(0)。
内容的提问来源于stack exchange,提问作者RJ34
相关产品推荐
相关产品推荐

