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

使用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的DATE
  • SEC_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)

代码说明

  1. 按ID分组后,先过滤掉DATE为空的行,直接排除无有效日期的分组(如ID=5)
  2. 通过first()获取每组的首个日期INDX_DATE和对应SIDE
  3. 筛选出日期晚于INDX_DATE且SIDE匹配的行,取每组第一行作为SEC_DATE的来源
  4. 汇总时用default=NA确保无匹配项时SEC_DATE显示为NA,最后取消分组得到结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 00:56:00