R语言tidyverse基于指定分组最小日期过滤另一分组行的实现
实现方法
你不需要用长宽表转换的逻辑,直接用dplyr的分组计算+过滤即可,效率很高也容易理解:
核心思路
- 按
id分组,为每个ID计算出type=B的最小日期作为过滤阈值 - 仅删除
type=A且日期晚于上述阈值的行,其余所有行全部保留
代码实现
library(dplyr) # 示例数据 tbl <- tibble(id = c(rep(1,5), rep(2,5)), type = c("A","A","A","B","C","A","A","B","B","C"), dat = as.Date("2021-12-07") - c(3,0,1,2,0,3,6,2,4,3)) # 处理逻辑 result <- tbl %>% group_by(id) %>% # 计算每个id下type为B的最小日期作为阈值 mutate(b_min_date = min(dat[type == "B"], na.rm = TRUE)) %>% # 过滤规则:排除type为A且日期大于阈值的行 filter(!(type == "A" & dat > b_min_date)) %>% ungroup() %>% # 删除临时计算的阈值列 select(-b_min_date)
运行上述代码得到的结果和你给出的预期输出完全一致。如果需要适配其他分组的过滤需求,只需要修改代码里对应的type取值即可。
内容的提问来源于stack exchange,提问作者AugSB
相关产品推荐
相关产品推荐

