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

如何筛选Ind为Y的行并捕获从N/O转为Y的首次日期?

问题说明

需要筛选出Ind为'Y'的数据,但仅保留Ind从'N'或'O'切换为'Y'的第一行,同时新增Check_Date字段并设为该行的Date值。

输入数据

ID  Date    Ind 
2   201905  N    
2   201906  N    
2   201907  N    
2   201908  N    
2   201909  N    
2   201910  N    
2   201911  N    
2   201912  Y   
2   202001  Y    
2   202002  Y    
2   202003  Y    
2   202004  Y    
2   202005  N    
2   202006  N    
2   202007  N    
2   202008  Y   
3   201906  N    

期望结果

ID  Date    Ind Check_Date
2   201912  Y   201912
2   202008  Y   202008

现有代码问题分析

你提供的dplyr代码存在以下问题:

  • 逻辑完全偏离需求:group(ID)后使用filter(Date == min(Date))是筛选每个ID的最早记录,而非针对Ind状态切换的筛选;后续的filter(Ind == 'Y')只能拿到每个ID最早日期且Ind为Y的行,完全无法识别多次状态切换的场景。
  • 缺少状态切换判断:没有检测当前行Ind是否是从'N'/'O'切换为'Y'的关键动作,自然无法捕捉到ID=2的两次Y切换。
  • 语法错误:group(ID)后遗漏了管道符%>%,导致代码无法正常执行。

正确代码实现

要实现需求,需按ID分组后,通过lag()函数获取上一行的Ind值,判断当前行是否为从'N'/'O'切换到'Y'的首次行,最后新增Check_Date字段:

library(dplyr)

PO %>%
  group_by(ID) %>%
  # 获取上一行的Ind值,标记是否为符合要求的切换行
  mutate(
    prev_ind = lag(Ind, default = ""),
    is_switch = Ind == "Y" & prev_ind %in% c("N", "O")
  ) %>%
  # 筛选出切换行
  filter(is_switch) %>%
  # 设置Check_Date字段
  mutate(Check_Date = Date) %>%
  # 保留需要的列
  select(ID, Date, Ind, Check_Date) %>%
  ungroup()

运行这段代码后,即可得到符合预期的结果,同时保留ID=2两次从N切换到Y的行,并正确设置Check_Date字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 03:50:37