如何基于多条件为分组后的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)
代码说明
group_by(ID):将数据按ID分组,确保每个ID的判断独立进行- 辅助列
has_2020/has_2021/has_2022:快速标记当前ID是否包含对应年份的数据 case_when:按规则优先级依次判断,避免逻辑冲突(比如同时满足多个规则时,优先匹配先写的条件)ungroup():取消分组,恢复DataFrame的常规结构
运行代码后,生成的FLAG列将与示例中的Flag列完全一致。
内容的提问来源于stack exchange,提问作者Sarah
相关产品推荐
相关产品推荐

