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

