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

如何基于多条件为分组后的DataFrame生成FLAG列?

按ID分组生成FLAG列的R解决方案

给定包含ID和Year两列的DataFrame,需按ID分组后生成FLAG列,规则如下:

  • 仅存在2020或2021年数据时,输出"Gap"
  • 同时存在2020和2021年数据时,输出"Ap21"
  • 同时存在2020、2021和2022年数据时,输出"Ap22"
  • 2020和2021年数据均不存在或其他情况,输出"notupdated"

示例目标DataFrame

data <- data.frame(
  ID = c("A", "A", "A", "B", "B", "B", "C", "C", "C", "C", "D", "D"),  
  Year = c(2019, 2021, 2022, 2019, 2020, 2021, 2019, 2020, 2021, 2022, 2018, 2019), 
  Flag = c("Gap", "Gap", "Gap", "Ap21", "Ap21", "Ap21", "Ap22", "Ap22", "Ap22", "Ap22", 
           "notupdated", "notupdated")
)

解决方案代码

使用dplyr包可以简洁实现分组判断逻辑:

library(dplyr)

result <- data %>%
  group_by(ID) %>%
  mutate(
    # 标记各年份是否存在
    has_2020 = 2020 %in% Year,
    has_2021 = 2021 %in% Year,
    has_2022 = 2022 %in% Year,
    # 按规则生成FLAG列
    FLAG = case_when(
      # 优先级从高到低判断
      has_2020 & has_2021 & has_2022 ~ "Ap22",
      has_2020 & has_2021 ~ "Ap21",
      xor(has_2020, has_2021) ~ "Gap", # 仅存在2020或2021其中一个
      TRUE ~ "notupdated" # 其他所有情况
    )
  ) %>%
  ungroup()

# 输出结果
print(result)

代码说明

  1. group_by(ID):将数据按ID分组,确保每个ID的判断独立进行
  2. 辅助列has_2020/has_2021/has_2022:快速标记当前ID是否包含对应年份的数据
  3. case_when:按规则优先级依次判断,避免逻辑冲突(比如同时满足多个规则时,优先匹配先写的条件)
  4. ungroup():取消分组,恢复DataFrame的常规结构

运行代码后,生成的FLAG列将与示例中的Flag列完全一致。

内容的提问来源于stack exchange,提问作者Sarah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 00:33:27