如何判断州-年份组的前序组是否所有prop≤0.6并生成标记列
问题描述
现有如下数据框:
structure(list(state = c("CA", "CA", "CA", "CA", "CA", "CA", "WA", "WA", "WA", "PA", "PA"), prop = c(0.4, 0.5, 0.3, NA, 0.61, 0.3, 0.76, 0.4, 0.35, 0.21, NA), year = c(2000, 2000, 2001, 2001, 2001, 2002, 2002, 2002, 2004, 2000, 2005)), class = "data.frame", row.names = c(NA, -11L))
需要生成competitive列,规则如下:
- 若当前州-年份组无对应前序州-年份组(如CA-2000无CA-1999数据),标记为NA;
- 若前序州-年份组的所有
prop值均≤0.6,标记为1; - 若前序州-年份组存在任意
prop值>0.6,标记为0。
期望输出:
structure(list(state = c("CA", "CA", "CA", "CA", "CA", "CA", "WA", "WA", "WA", "PA", "PA"), prop = c(0.4, 0.5, 0.3, NA, 0.61, 0.3, 0.76, 0.4, 0.35, 0.21, NA), year = c(2000, 2000, 2001, 2001, 2001, 2002, 2002, 2002, 2004, 2000, 2005), competitive = c(NA, NA, 1, 1, 1, 0, NA, NA, 0, NA, 1)), class = "data.frame", row.names = c(NA, -11L))
尝试过以下代码,但仅能处理单行前序数据,无法覆盖整个前序组:
df <- df %>% arrange(state, year) %>% group_by(state) %>% mutate( prev = lag(prop <= 0.60), competitive = ifelse(is.na(prev), NA, prev), competitive = ifelse(any(prop >= 0.60), 0, 1) )
解决方案
可以通过分组计算前序年份的整体情况来实现需求,代码如下:
library(dplyr) df <- df %>% arrange(state, year) %>% group_by(state) %>% # 计算当前记录的前序年份,并判断该年份是否在当前州的年份列表中 mutate( prev_year = year - 1, has_prev = prev_year %in% unique(year) ) %>% # 根据前序年份的prop情况生成competitive列 mutate( competitive = case_when( !has_prev ~ NA_integer_, # 检查前序年份所有prop(忽略NA)是否均≤0.6 all(prop[year == prev_year] <= 0.6, na.rm = TRUE) ~ 1L, # 其余情况则标记为0 TRUE ~ 0L ) ) %>% # 移除辅助列并取消分组 select(-prev_year, -has_prev) %>% ungroup()
代码逻辑说明:
- 排序与分组:先按
state和year排序,确保数据顺序正确,再按state分组处理每个州的独立数据; - 辅助列计算:
prev_year记录当前年份的前一年,has_prev判断该前序年份是否在当前州的已有年份中,以此确定是否存在前序组; - 生成目标列:使用
case_when分情况赋值:- 无前置组时直接返回NA;
- 前置组所有
prop(忽略NA)都≤0.6时返回1; - 前置组存在任意
prop>0.6时返回0;
- 清理数据:移除中间辅助列并取消分组,得到最终结果。
内容的提问来源于stack exchange,提问作者hy9fesh
相关产品推荐
相关产品推荐

