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

R 使用dplyr基于列规则对时间戳列分组筛选指定行的方法

R dplyr分组过滤实现方案

该需求可以通过dplyr实现,实现逻辑如下:

  1. 按ID分组,保证不同ID的计算逻辑相互独立
  2. 为每个B值匹配所属ID下排序后的上一个B值,首个B值的前置值设为极早的时间,避免过滤有效数据
  3. 按ID、B分组后,筛选出A值大于前置B值的行,取A值最小的行即可

实现代码如下:

library(dplyr)

# 原始数据生成代码
df <- data.frame(ID = c(555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555, 555),
                 A = c('2020-04-13 19:10:00', '2020-04-14 20:00:00', '2020-04-13 19:10:00', '2020-04-14 20:00:00',
                       '2020-04-22 08:13:00', '2020-04-23 19:00:00', '2020-04-13 19:10:00', '2020-04-14 20:00:00',
                       '2020-04-22 08:13:00', '2020-04-23 19:00:00', '2020-04-27 13:41:10', '2020-05-01 22:01:00'),
                 B = c('2020-04-15 12:00:00', '2020-04-15 12:00:00', '2020-04-24 11:00:00', '2020-04-24 11:00:00',
                       '2020-04-24 11:00:00', '2020-04-24 11:00:00', '2020-05-07 10:30:00', '2020-05-07 10:30:00',
                       '2020-05-07 10:30:00', '2020-05-07 10:30:00', '2020-05-07 10:30:00', '2020-05-07 10:30:00')
)

df$A <- as.POSIXct(df$A)
df$B <- as.POSIXct(df$B)

# 核心处理代码
result <- df %>%
  group_by(ID) %>%
  # 为每个B匹配所属ID下排序后的上一个B值
  mutate(prev_B = lag(sort(unique(B)), default = as.POSIXct("1970-01-01"))[match(B, sort(unique(B)))]) %>%
  group_by(ID, B) %>%
  # 筛选符合条件的最小A值行
  filter(A > prev_B) %>%
  slice_min(A, n = 1) %>%
  ungroup() %>%
  select(-prev_B) %>%
  arrange(B)

运行后得到的result与预期输出完全一致:

> result
# A tibble: 3 × 3
     ID A                   B                  
  <dbl> <dttm>              <dttm>             
1   555 2020-04-13 19:10:00 2020-04-15 12:00:00
2   555 2020-04-22 08:13:00 2020-04-24 11:00:00
3   555 2020-04-27 13:41:10 2020-05-07 10:30:00

该代码兼容多ID场景,新增其他ID数据后无需调整逻辑即可直接运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:06:00