如何用dplyr按CountryCode和日期范围连接两个R数据框?
解决R中双条件连接数据框的问题
问题分析
你需要基于两个条件连接DF1和DF2:
- 相同的
CountryCode EventDate落在ValidFrom与ValidUntil的日期范围内
你的代码未得到预期结果,核心问题大概率是日期未转换为Date类型,导致between()无法正确判断日期范围;另外join_by中的等式建议使用标准的==写法。
解决方案
步骤1:确保日期为Date类型
首先将数据中的日期字符串转换为R的Date类型,这是正确比较日期的前提:
library(dplyr) # 构造示例数据(转换日期类型) DF1 <- tibble( CountryCode = c("NL", "DE"), EventDate = as.Date(c("2023-02-17", "2022-08-17")) ) DF2 <- tibble( CountryCode = c("NL", "NL", "DE", "DE"), FreightCost = c(10, 12, 8, 11), ValidFrom = as.Date(c("2021-07-01", "2021-08-01", "2021-08-01", "2023-01-01")), ValidUntil = as.Date(c("2022-07-31", "2025-12-31", "2022-12-31", "2025-12-31")) )
方法一:先连接再筛选(直观易理解)
先按CountryCode连接两个数据框,再筛选符合日期范围的行:
DF_final <- DF1 %>% left_join(DF2, by = "CountryCode") %>% filter(EventDate >= ValidFrom, EventDate <= ValidUntil) %>% select(CountryCode, EventDate, FreightCost)
方法二:使用dplyr的join_by(更高效的直接连接)
利用join_by直接在连接时指定双条件,需要确保dplyr版本在1.1.0及以上:
DF_final <- DF1 %>% left_join(DF2, by = join_by( CountryCode == CountryCode, between(EventDate, ValidFrom, ValidUntil) )) %>% select(CountryCode, EventDate, FreightCost)
验证结果
运行上述代码后,DF_final将得到你期望的输出:
| CountryCode | EventDate | FreightCost |
|---|---|---|
| NL | 2023-02-17 | 12 |
| DE | 2022-08-17 | 8 |
内容的提问来源于stack exchange,提问作者learnct
相关产品推荐
相关产品推荐

