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

如何用dplyr按CountryCode和日期范围连接两个R数据框?

解决R中双条件连接数据框的问题

问题分析

你需要基于两个条件连接DF1和DF2:

  1. 相同的CountryCode
  2. 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将得到你期望的输出:

CountryCodeEventDateFreightCost
NL2023-02-1712
DE2022-08-178

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 17:42:06