如何筛选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
相关产品推荐
相关产品推荐

