R 使用dplyr基于列规则对时间戳列分组筛选指定行的方法
R dplyr分组过滤实现方案
该需求可以通过dplyr实现,实现逻辑如下:
- 按ID分组,保证不同ID的计算逻辑相互独立
- 为每个B值匹配所属ID下排序后的上一个B值,首个B值的前置值设为极早的时间,避免过滤有效数据
- 按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
相关产品推荐
相关产品推荐

