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

基于多条件生成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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 20:25:13