用 R 中最近一年的数据替换 data.frame 的历史数据?

replace historical data of a data.frame with the most recent year data in R?

我想用 Ob2020 中的数据替换 FakeData 中所有年份的 Jan 01 to Jun 25,以替换 data.frame 中的 two variables (Level & Flow)。这是我已经开始的,正在寻找实现我目标的建议。

library(tidyverse)
library(lubridate)

set.seed(1500)

FakeData <- data.frame(Date = seq(as.Date("2010-01-01"), to = as.Date("2018-12-31"), by = "days"),
                       Level = runif(3287, 0, 30), Flow = runif(3287, 1,10))

Ob2020 <- data.frame(Date = seq(as.Date("2020-01-01"), to = as.Date("2020-06-25"), by = "days"),
                     Level = runif(177, 0, 30), Flow = runif(177, 1,10))

如果您不介意 data.table 解决方案,这里是一个更新连接:

library(data.table)
#extract year and month of the date
setDT(FakeData)[, c("day", "mth") := .(mday(Date), month(Date))]
setDT(Ob2020)[, c("day", "mth") := .(mday(Date), month(Date))]

#print to console to show old values        
head(FakeData)
head(Ob2020)

cols <- c("Level", "Flow")
FakeData[Ob2020[mth<=6L & day<=25], on=.(day, mth),
    (cols) := mget(paste0("i.", cols))]

#print to console to show new values
head(FakeData)

这是使用 dplyrlubridate 的方法:

library(dplyr)
library(lubridate)

FakeData %>%
  mutate(day = day(Date), month = month(Date)) %>%
  left_join(Ob2020 %>%
              mutate(day = day(Date), month = month(Date)), 
              by = c('day', 'month')) %>%
   mutate(Level = coalesce(Level.y, Level.x), 
          Flow = coalesce(Flow.y, Flow.x)) %>%
  select(Date = Date.x, Level, Flow)