如何从DF1中筛选小于等于DF2日期的最近最大日期对应数据
问题场景
我现在有两个DataFrame:
- DF1是月度数据快照,存储每个月生效的账户数据
- DF2存储指定的查询日期
需要从DF1中筛选出满足「DF1的日期 ≤ DF2的日期」条件的最大日期对应的所有数据。
示例数据
DF1
| Account | Date |
|---|---|
| A1000001 | 1-JAN-2021 |
| A1000002 | 1-FEB-2021 |
| A1000003 | 1-MAR-2021 |
| A1000004 | 1-APR-2021 |
DF2
| Date |
|---|
| 15-MAR-2021 |
预期输出
| Account | Date |
|---|---|
| A1000003 | 1-MAR-2021 |
实现方案
注意要先把两个表的日期列转成标准日期格式,不能直接用字符串比较。
方法1:dplyr实现(适合tidyverse技术栈用户)
library(dplyr) library(lubridate) # 转换日期格式 DF1 <- DF1 %>% mutate(Date = dmy(Date)) DF2 <- DF2 %>% mutate(Date = dmy(Date)) result <- DF1 %>% # 筛选出所有日期小于等于DF2查询日期的记录 filter(Date <= DF2$Date) %>% # 取最大日期对应的全部记录 filter(Date == max(Date))
方法2:data.table滚动连接实现(效率更高,适合大数据量场景)
library(data.table) library(lubridate) # 转换为data.table格式并处理日期 setDT(DF1)[, Date := dmy(Date)] setDT(DF2)[, Date := dmy(Date)] # 滚动连接直接匹配最近的不大于查询日期的记录 result <- DF1[DF2, on = "Date", roll = TRUE]
如果DF2包含多条查询日期,上述两种方法都可以直接适配,不需要额外修改逻辑。
内容的提问来源于stack exchange,提问作者Rameet
相关产品推荐
相关产品推荐

