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

用R中最近一年的数据替换data.frame的历史数据?,r,dataframe,replace,tidyverse,lubridate,R,Dataframe,Replace,Tidyverse,Lubridate,我想用我的data.frame的两个变量(级别和流量)的Ob2020中的数据替换01年1月至6月25日期间中所有年份的FakeData。以下是我的起点,我正在寻找实现我的目标的建议 library(tidyverse) library(lubridate) set.seed(1500) FakeData <- data.frame(Date = seq(as.Date("2010-01-01"), to = as.Date("2018-12-31"

我想用我的
data.frame的
两个变量(级别和流量)
Ob2020
中的数据替换
01年1月至6月25日期间
中所有年份的
FakeData
。以下是我的起点,我正在寻找实现我的目标的建议

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))
库(tidyverse)
图书馆(lubridate)
种子集(1500)

FakeData如果您不介意使用
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)
库(data.table)
#提取日期的年份和月份
setDT(伪造数据)[,c(“日”、“月”):=(日(日)、月(日))]
setDT(Ob2020)[,c(“日”、“月”):=(日(日)、月(日))]
#打印到控制台以显示旧值
主管(伪造数据)
总目(Ob2020)

cols这里有一种使用
dplyr
lubridate
的方法:

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)

     

在您的示例中,一些Jan01到Jun25在0b2020中没有相应的值。如果是这样的话,我想应该是这样的吧?是的-这是因为2020年在2月(闰年)有一个额外的一天。我添加了一个带有
数据的解决方案。table
join可能会有帮助