使用dplyr实现分组条件过滤:按ID提取指定日期字段
用dplyr实现指定分组数据处理需求
原始数据
DF <- tibble::tribble( ~ID, ~DATE, ~SIDE, 1L, "2010-10-10", "LEFT", 2L, "2005-05-05", "RIGHT", 2L, "2006-06-06", "RIGHT", 3L, "2007-07-07", "LEFT", 3L, "2008-08-08", "RIGHT", 3L, "2009-09-09", "LEFT", 4L, "2010-10-10", "LEFT", 4L, "2011-11-11", NA, 5L, NA, "LEFT" )
期望输出
ID INDX_DATE SIDE SEC_DATE 1 1 2010-10-10 LEFT NA 2 2 2005-05-05 RIGHT 2006-06-06 3 3 2007-07-07 LEFT 2009-09-09 4 4 2010-10-10 LEFT NA
处理逻辑
- 按
ID进行分组 INDX_DATE为每个ID对应的首个非NA的DATESEC_DATE为INDX_DATE之后,第一个与该日期对应SIDE相同的DATE- 排除无有效
INDX_DATE的分组(如ID=5)
dplyr解决方案
library(dplyr) result <- DF %>% group_by(ID) %>% # 过滤掉DATE为空的行,确保能获取有效首个日期 filter(!is.na(DATE)) %>% # 标记每组的首个日期和对应SIDE mutate( INDX_DATE = first(DATE), FIRST_SIDE = first(SIDE) ) %>% # 筛选INDX_DATE之后、SIDE匹配的行 filter(DATE > INDX_DATE, SIDE == FIRST_SIDE) %>% # 取每组第一个符合条件的记录 slice_head(n = 1) %>% # 汇总结果,无匹配项时SEC_DATE设为NA summarise( INDX_DATE = first(INDX_DATE), SIDE = first(FIRST_SIDE), SEC_DATE = first(DATE, default = NA) ) %>% ungroup() print(result)
代码说明
- 按
ID分组后,先过滤掉DATE为空的行,直接排除无有效日期的分组(如ID=5) - 通过
first()获取每组的首个日期INDX_DATE和对应SIDE - 筛选出日期晚于
INDX_DATE且SIDE匹配的行,取每组第一行作为SEC_DATE的来源 - 汇总时用
default=NA确保无匹配项时SEC_DATE显示为NA,最后取消分组得到结果
内容的提问来源于stack exchange,提问作者hklovs
相关产品推荐
相关产品推荐

