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

如何使用dplyr和lubridate基于日期偏移从dfB提取数据填充dfA

实现步骤
  • 第一步:加载所需工具包
library(dplyr)
library(lubridate)
  • 第二步:统一两个数据框的日期格式,原始日期为「日/月/年」结构,使用lubridate的dmy()函数解析为标准日期类型
# 处理dfA的日期列
dfA <- dfA %>%
  mutate(Date = dmy(Date))

# 处理dfB的日期列
dfB <- dfB %>%
  mutate(Date = dmy(Date))
  • 第三步:按偏移天数匹配dfB的字段,填充到dfA中
    通过多次左连接实现,每次连接对应一个偏移天数,匹配后重命名字段即可,以下为dplyr 1.1.0及以上版本的写法:
dfA_final <- dfA %>%
  # 匹配偏移1天的Event、Time(日期减1天)
  left_join(dfB %>% select(Date, Event, Time), by = join_by((Date - days(1)) == Date)) %>%
  rename(Event1 = Event, Time1 = Time) %>%
  # 匹配偏移2天的Event、Time(日期减2天)
  left_join(dfB %>% select(Date, Event, Time), by = join_by((Date - days(2)) == Date)) %>%
  rename(Event2 = Event, Time2 = Time) %>%
  # 匹配偏移3天的Event、Time(日期减3天)
  left_join(dfB %>% select(Date, Event, Time), by = join_by((Date - days(3)) == Date)) %>%
  rename(Event3 = Event, Time3 = Time)

如果使用低于1.1.0版本的dplyr,不支持join_by语法,可以用如下兼容写法:

dfA_final <- dfA %>%
  # 先生成临时偏移日期列
  mutate(date_offset1 = Date - days(1),
         date_offset2 = Date - days(2),
         date_offset3 = Date - days(3)) %>%
  # 逐列匹配
  left_join(dfB %>% select(Date, Event, Time) %>% rename(date_offset1 = Date, Event1 = Event, Time1 = Time), by = "date_offset1") %>%
  left_join(dfB %>% select(Date, Event, Time) %>% rename(date_offset2 = Date, Event2 = Event, Time2 = Time), by = "date_offset2") %>%
  left_join(dfB %>% select(Date, Event, Time) %>% rename(date_offset3 = Date, Event3 = Event, Time3 = Time), by = "date_offset3") %>%
  # 删除临时偏移列
  select(-starts_with("date_offset"))

注意:如果某一天的偏移日期在dfB中没有对应记录,对应字段会自动填充为NA,符合常规数据匹配逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:24:02