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

如何判断州-年份组的前序组是否所有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()

代码逻辑说明:

  1. 排序与分组:先按state和year排序,确保数据顺序正确,再按state分组处理每个州的独立数据;
  2. 辅助列计算:prev_year记录当前年份的前一年,has_prev判断该前序年份是否在当前州的已有年份中,以此确定是否存在前序组;
  3. 生成目标列:使用case_when分情况赋值:
    • 无前置组时直接返回NA;
    • 前置组所有prop(忽略NA)都≤0.6时返回1;
    • 前置组存在任意prop>0.6时返回0;
  4. 清理数据:移除中间辅助列并取消分组,得到最终结果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 10:55:32