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

如何在R中基于另一数据框的日期差过滤数据框?

R语言dplyr实现非对称日期分组过滤需求

需求说明

使用dplyr完成以下数据过滤,适配大数据框的分组场景:

  • 主数据框df包含name、values(name的子类别)和gooddates字段,按name+values分组
  • 过滤数据框filterdf包含name和baddates字段,按name分组
  • 按name维度,排除df中所有gooddates处于对应baddates前0至2天(含当天)的记录

示例数据

df <- data.frame (name  = c("name_1", "name_1", "name_2", "name_2", "name_2", "name_3", "name_3", "name_3"),
                  values = c("value_1", "value_1", "value_2","value_4","value_4","value_3","value_3","value_3"),
                  gooddates = c("2022-02-02","2022-02-03","2022-02-04","2022-02-03","2022-02-04","2022-02-03","2022-02-04","2022-02-06"))

filterdf <- data.frame(name  = c("name_1", "name_2", "name_3", "name_3"),
                       baddates = c("2022-02-03","2022-02-03","2022-02-04","2022-02-05"))

原方法问题

之前尝试的对称过滤逻辑(abs(baddates - gooddates) < 2)无法满足需求,因为该逻辑会排除baddates前后2天的记录,而我们只需要排除baddates之前0-2天(含当天)的记录。

解决方案

library(dplyr)

# 转换日期列为Date类型,确保能进行日期运算
df <- df %>% mutate(gooddates = as.Date(gooddates))
filterdf <- filterdf %>% mutate(baddates = as.Date(baddates))

# 关联数据+分组过滤
result <- df %>%
  # 按name关联两个数据框,让每条df记录匹配对应name的所有baddates
  left_join(filterdf, by = "name") %>%
  # 按df的原始记录维度分组
  group_by(name, values, gooddates) %>%
  # 仅保留:当前gooddates不在任何对应baddates的前0-2天范围内的记录
  filter(all(baddates - gooddates < 0 | baddates - gooddates > 2)) %>%
  ungroup() %>%
  # 保留需要的字段并去重(关联后会产生重复行)
  select(name, values, gooddates) %>%
  distinct()

验证结果

运行上述代码后,得到的结果与期望一致:

# 输出结果
result
#>     name  values  gooddates
#> 1 name_2 value_2 2022-02-04
#> 2 name_2 value_4 2022-02-04
#> 3 name_3 value_3 2022-02-06

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 04:40:41