如何在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
相关产品推荐
相关产品推荐

